【问题标题】:Safe way to execute JavaScript code - on same server or another server?执行 JavaScript 代码的安全方法 - 在同一台服务器或另一台服务器上?
【发布时间】:2019-08-16 17:27:33
【问题描述】:

我有一个网站构建器,它允许用户将 HTML 块(imgdiv 等...)拖放到页面中。他们可以保存它。保存后,他们可以查看该页面。

我还允许使用 JavaScript 等自定义代码。将他们的页面显示在子域(mypage.example.com)上的另一台服务器上但仍然从与主服务器相同的数据库中获取是否安全,或者将其放在与主服务器相同的服务器上是否无关紧要服务器?

据我所知,他们无法执行任何 PHP 代码,因为我将使用echo 来显示页面内容。

感谢您的帮助!

【问题讨论】:

  • 你有没有做任何事情来清理 HTML 到protect against XSS
  • 您需要验证、转义和清理用户 JavaScript 以避免 XSS 或/或 CSRF。
  • @AndTheGodsMadeLove 清理和转义用户的 JS 会干扰代码吗?它实际上是用于跟踪他们可以放入该页面的代码,例如 Google Analytics(分析)
  • As far as I know, they cannot execute any PHP code since I will be using echo to display the page content. - 不,不要那样做,它非常慢:我假设你正在谈论的代码是 echo file_get_contents(file); - 首先,你将把整个文件放在 RAM 中一次(因此它使用了比需要更多的 RAM),并且直到整个文件从磁盘加载后才开始传输(因此它启动缓慢),使用 readfile() 代替,它启动得更快(它从第一个开始块已被读取,而不是 all of it),它同时从磁盘传输和读取,
  • 这使它更快,并且无论文件有多大,它都不会使用任何大量的内存(相同数量的内存用于 1KB 文件和 100GB 文件)跨度>

标签: javascript php apache security ubuntu


【解决方案1】:

这取决于您的设置。如果您允许他们运行自定义 JavaScript,他们可能会从其他用户那里窃取会话令牌,这些令牌可用于窃取其他帐户。我会推荐reading about XSS (Cross-Site-Scripting)

简而言之:XSS 是将代码注入网站的漏洞,该漏洞将在其他人的计算机上运行。

此时给你一个关于如何做到这一点的严格教程是没有意义的,因为每个系统都是不同的,需要不同的配置来抵御攻击。

让用户将代码放在某处总是有风险的!

【讨论】:

  • 如果他们的页面/代码在userspage.example.com等子域上显示并运行,他们能否从主域example.com窃取会话?
  • @darrenfisher990:取决于 cookie 的设置方式。您可以将它们设置为仅对主域可用,但您必须确保您没有使用像*.example.com这样的通配符
  • >Letting users put code somewhere is always a risk! 我不同意。这是一个很好的例子:sqlite.js demo page,其中 SQLite 被移植到 javascript,并且您可以直接将 SQL 执行到 sql 服务器...在您的浏览器中以 javascript 运行。用户可以在那里执行代码,但风险在哪里?用户唯一能做的就是破坏 SQL db,它只存在于他们自己的浏览器会话中的 RAM 中,不会影响其他任何人,而要恢复 db,你需要做的就是刷新页面,你将从一个干净的数据库开始。
【解决方案2】:

不需要其他服务器,但您确实需要另一个域来防止 Cross Site Scripting 在您的主页上进行攻击。不,一个子域may not be sufficient,为了安全起见,把它放在另一个域上。 (幸运的是,如果您可以使用 .tk 域,则域可以是 acquired for free

将他们的页面显示在子域的另一台服务器上是否安全

即使是一个子域could be dangerous,只要把它放在另一个域上,你就安全了。

或者和主服务器放在同一个服务器上也没关系?

您可以在同一台服务器上使用它。顺便说一句,您是否知道通过共享虚拟主机服务(如 GoDaddy、hostgator 等),有数千个网站共享一个物理服务器?

  • 另外,不要听人们说您需要清理或过滤 HTML,这是 正确的。在我看来,没有必要过滤掉任何数据损坏的东西。不要对您的用户这样做,没有必要这样做。 (至少我想不出来)

据我所知,他们无法执行任何 PHP 代码,因为我将使用 echo 来显示页面内容。

正确。如果您正在执行include("file");eval($code);,那么他们可以执行服务器端代码,但只要您只是在执行echo $code;,他们将无法执行服务器端代码,这不是安全性问题。

【讨论】:

  • 如果我使用 PHP 设置禁用子域上的 cookie 和会话,他们仍然能够从主域劫持/窃取会话或 cookie 信息吗?
  • @darrenfisher990 我 认为 所以,是的(还没有实际测试过),因为您可以通过 javascript 设置 cookie,它们可以显示带有 <script> 标签的 html,其中包含 javascript生成攻击cookie。 (并且不要考虑过滤脚本标签,因为它可以是 ANY 标签,例如<div onmouseover="javascript:create_attack_cookie();">evil div</div>),认真地做安全的事情:获得一个专用域来运行不受信任的代码。你可以在dot.tk免费获得一个域名,你可以在cloudflare.com免费获得DNS服务,它不需要你花一分钱
猜你喜欢
  • 2010-12-22
  • 2023-03-14
  • 2011-02-24
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 2018-01-20
相关资源
最近更新 更多