我的eval()安全吗?

时间:2014-02-07 21:50:07

标签: javascript regex security xss

我在这里制作了一个骰子:http://howderek.com/projects/diediedie/

我希望实现数学运算,以便我的用户可以将数学操作预先设置为其滚动,这对RPG很有用。

我没有构建一个处理数学的函数,或者使用像 math.js 这样的库,而是认为由于JavaScript内置了数学运算,因此{{1}可能会很好用。 }。

我关注eval()的原因是,将eval()附加到DieDieDie的网址后,将?q=whatever输入框中并将其传递给DieDieDie

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

从(http://howderek.com/projects/diediedie/js/diediedie.js):

eval()

所以,我想知道是否有办法绕过RegEx,只需在框中输入文字即可if (!replaced.match(/[^0-9 | + | \- | * | \/ | ( | ) | \. | % | > | <]/g)) { result = eval(replaced); } else { throw 'Unsafe eval (more than just math), refusing to execute.'; } 运行代码。

1 个答案:

答案 0 :(得分:2)

复杂性是安全的敌人,所以我发现最好实现一个你知道的安全的简单解决方案,而不是试图想出一些更复杂的可能做了一些安全的事情(但是在找到漏洞之前没有人确定)。

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

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

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

<iframe src="http://script.example.com/projects/diediedie/" sandbox="allow-scripts" />

这将允许脚本,但是如果在您的RegEx中找到漏洞利用,则将阻止IFrame之外的表单和导航。由于它位于不同的域中,因此您的主站点不会通过XSS进行攻击。

HTML5 Security Cheat Sheet guidance on OWASP表明这是沙箱的目的:

  

将iframe的沙箱属性用于不受信任的内容

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

在呈现IFrame之前,您应首先测试是否支持沙箱:

<iframe src="/blank.htm" sandbox="allow-scripts" id="foo" />

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
}

通过动态更改src而不是在sandboxSupportedfalse时重定向,这样做更安全,因为如果重定向不会导致iframe不会被意外呈现及时发生。

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