我在这里建了一个骰子滚筒:http://howderek.com/projects/diediedie/
我想实现数学,以便我的用户可以对他们的卷进行数学运算,这对于 Angular 色扮演游戏很有用。
我认为,由于 JavaScript 内置了数学功能,因此这可能是 eval()
的一个很好的用途,而不是构建一个函数来处理数学,或者使用像 math.js 这样的库。 .
我担心 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()
运行代码只需在框中输入文本即可。
最佳答案
复杂性是安全性的敌人,因此我发现最好实现一个您知道安全的简单解决方案,而不是尝试提出可能更复杂的解决方案 em> 做了一些安全的事情(但在发现漏洞之前没有人能完全确定)。
一种安全的方法是您可以使用 HTML5 Sandbox加载托管您的脚本的页面,那么您无需担心您的正则表达式是否可以被绕过。
您需要将页面托管在与主站点不同的域下(例如 script.example.com
而不是 www.example.com
)。这将防止任何 XSS如果攻击者说服用户直接访问页面(在沙箱之外),则进行攻击。
您需要使用如下代码在 IFrame 中启用脚本:
<iframe src="http://script.example.com/projects/diediedie/" sandbox="allow-scripts" />
这将允许脚本,但如果发现您的正则表达式存在漏洞,IFrame 之外的表单和导航将被阻止。由于它位于不同的域中,因此您的主站点无法通过 XSS 受到攻击.
HTML5 Security Cheat Sheet guidance on OWASP指出这就是沙箱的目的:
Use the sandbox attribute of an iframe for untrusted content
因为您允许不受信任的内容通过 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
来做到这一点更安全。而不是重定向走 if sandboxSupported
是 false
因为如果重定向没有及时发生,iframe 就不会意外地被渲染。
要使其能够跨域工作(在 script.example.com
和 www.example.com
之间),您需要使用 HTML5 的 Window.postMessage
功能。这将启用 IFrame 和外部窗口之间的安全通信。请注意设置 document.domain
不安全,因为它首先会破坏在单独域上托管页面的目的。
关于javascript - 我的 eval() 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21638412/