javascript - 我的 eval() 安全吗?

标签 javascript regex security xss

我在这里建了一个骰子滚筒: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 sandboxSupportedfalse因为如果重定向没有及时发生,iframe 就不会意外地被渲染。

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

关于javascript - 我的 eval() 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21638412/

相关文章:

security - 哈希和登录

security - 英特尔 SGX 开发人员许可和开源软件

javascript - 鼠标悬停在div上

javascript - 获取一个脚本来循环遍历多个变量

php - 正则表达式获取两个字符串 '$' 和 ';' 之间且前面不带 '//' 的任何内容

java - 使用 KeyStore.getEntry() 时出现 UnsupportedOperationException?

javascript - 渲染需要窗口对象的同构 React 组件

Javascript 数组返回所有的最后一个条目

java - 为什么 "hello\\s*world"与 "hello world"不匹配?

regex - 为什么我的正则表达式白名单没有捕获括号?