我在这里制作了一个骰子: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.';
}
运行代码。
答案 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
而不是在sandboxSupported
为false
时重定向,这样做更安全,因为如果重定向不会导致iframe不会被意外呈现及时发生。
要使其能够跨域工作(script.example.com
和www.example.com
之间),您需要使用HTML5的Window.postMessage
功能。这将实现IFrame和外部窗口之间的安全通信。请注意,设置document.domain
并不安全,因为它首先会破坏在单独域上托管页面的目的。