【问题标题】:Is my eval() safe?我的 eval() 安全吗?
【发布时间】:2014-02-07 21:50:07
【问题描述】:

我在这里建立了一个掷骰子:http://howderek.com/projects/diediedie/

我想实现数学,以便我的用户可以对他们的角色进行数学运算,这对 RPG 很有用。

我没有构建一个函数来处理数学,或者使用像 math.js 这样的库,我认为由于 JavaScript 内置了数学,这可能是 eval() 的一个很好的用途。

然而,我关心eval() 的原因是,将?q=whatever 附加到 DieDieDie 的 url 会在框中输入whatever 并将其传递给 DieDieDie

现在,显然,如果这只是一个 eval 控制台,那么很容易滥用和运行恶意 JavaScript,但事实并非如此,我在运行 eval() 之前使用 RegEx

发件人(http://howderek.com/projects/diediedie/js/diediedie.js):

if (!replaced.match(/[^0-9 | + | \- | * | \/ | ( | ) | \. | % | > | <]/g)) {
    result = eval(replaced);
} else {
    throw 'Unsafe eval (more than just math), refusing to execute.';
}

所以,我想知道是否有任何方法可以绕过正则表达式,并通过在 eval() 中输入文本来运行代码。

【问题讨论】:

  • 9发子弹的安全枪:)
  • @howderek 当然,但关键是要跳出框框思考。
  • 你也可以使用worker来阻止你的应用中的全局代码修改和阻止广告的展示,去掉胡萝卜。
  • 请注意,您的表达式也允许使用字符|| 不是字符类中的交替字符。你的表达就是:/[^0-9+\-*\/().%&gt;&lt;]/g
  • @howderek 是否冒险由您决定。我们只能说,你不能做到万无一失。你可以编写一个语法并验证它,即使用pegjs.majda.cz 或类似的。

标签: javascript regex security xss


【解决方案1】:

复杂性是安全性的敌人,因此我发现最好实施一个您知道安全的简单解决方案,而不是尝试提出更复杂的解决方案可能 em> 做了一些安全的事情(但在发现漏洞之前没人能确定)。

一种安全的方法是,您可以使用HTML5 Sandbox 来加载托管您的脚本的页面,然后您无需担心您的 RegEx 是否可以被绕过。

您需要将页面托管在与主站点不同的域下(例如,script.example.com 而不是 www.example.com)。如果攻击者诱使用户直接访问页面(在沙箱之外),这将阻止任何 XSS 攻击。

您需要使用以下代码在 IFrame 中启用脚本:

&lt;iframe src="http://script.example.com/projects/diediedie/" sandbox="allow-scripts" /&gt;

这将允许脚本,但如果发现您的 RegEx 存在漏洞,将阻止 IFrame 之外的表单和导航。由于它位于不同的域中,因此您的主站点无法通过XSS 进行攻击。

HTML5 Security Cheat Sheet guidance on OWASP 声明这是沙盒的目的:

对不受信任的内容使用 iframe 的沙盒属性

由于您允许不受信任的内容通过 eval 运行(尽管通过 RegEx “清理”),这似乎是对沙盒 IFrame 的适当使用。

在渲染 IFrame 之前,您应该先测试是否支持沙盒:

&lt;iframe src="/blank.htm" sandbox="allow-scripts" id="foo" /&gt;

var sandboxSupported = "sandbox" in document.createElement("iframe");

if (sandboxSupported) {
    document.getElementById('foo').setAttribute('src', 'http://script.example.com/projects/diediedie/');
}
else
{
    // Not safe to display IFrame
}

如果sandboxSupportedfalse 则通过动态更改src 而不是重定向离开更安全,因为如果重定向没有及时发生,iframe 将不会意外呈现。

要使其能够跨域工作(在script.example.comwww.example.com 之间),您需要使用HTML5 的Window.postMessage 功能。这将启用 IFrame 和外部窗口之间的安全通信。请注意,设置document.domain 并不安全,因为它首先会破坏将页面托管在单独域上的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2023-01-30
    • 2016-12-27
    • 2020-08-06
    • 2012-06-21
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多