Javascript 我的评估安全吗?

Javascript 我的评估安全吗?,javascript,regex,security,xss,Javascript,Regex,Security,Xss,我在这里做了一个骰子滚: 我想实现数学,这样我的用户就可以对他们的卷执行数学运算,这对RPG很有用 我没有构建一个函数来处理数学,也没有使用像math.js这样的库,而是认为既然JavaScript内置了数学,那么这可能是eval()的一个很好的用途 然而,我之所以关心eval(),是因为在diedie的url中添加?q=whatever,会将whatever输入框中并将其传递给diedie 现在,很明显,如果这仅仅是一个eval控制台,那么很容易滥用并通过它运行恶意JavaScript,但事实

我在这里做了一个骰子滚:

我想实现数学,这样我的用户就可以对他们的卷执行数学运算,这对RPG很有用

我没有构建一个函数来处理数学,也没有使用像math.js这样的库,而是认为既然JavaScript内置了数学,那么这可能是
eval()
的一个很好的用途

然而,我之所以关心
eval()
,是因为在diedie的url中添加
?q=whatever
,会将
whatever
输入框中并将其传递给diedie

现在,很明显,如果这仅仅是一个eval控制台,那么很容易滥用并通过它运行恶意JavaScript,但事实并非如此,我在运行
eval()

From():


if(!replacement.match(/[^0-9++-\\*\/\\(|)\.%\>复杂性是安全性的敌人,因此我发现最好实现一个简单的解决方案,您知道它是安全的,而不是试图提出一些更复杂的方案,可能会使某些东西变得安全(但在发现漏洞之前,没有人非常确定)

一种安全的方法是,您可以使用加载一个承载脚本的页面,这样您就不必担心是否可以绕过正则表达式

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

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

这将允许使用脚本,但如果发现您的正则表达式存在漏洞,将阻止IFrame之外的表单和导航。由于它位于不同的域中,您的主站点无法通过受到攻击

声明这是沙箱的目的:

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

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

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

如果
sandboxSupported
false
,则通过动态更改
src
而不是重定向,这样做更安全,因为如果重定向没有及时发生,则不会意外渲染iframe


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

就像一把9发子弹的枪一样安全:)@当然是howderek,但重点是跳出框框思考。你也可以使用worker来阻止应用程序中的全局代码修改,并阻止广告的显示,删除胡萝卜。请注意,你的表达式还允许字符
不是字符类中的替换字符。你的exp你可以这样说:
/[^0-9+\-*\/()。%>@howderek你是否冒险由你决定。我们只能说,你不能做到万无一失。你可以编写一个语法并验证它,即使用或类似的语法。
if (!replaced.match(/[^0-9 | + | \- | * | \/ | ( | ) | \. | % | > | <]/g)) {
    result = eval(replaced);
} else {
    throw 'Unsafe eval (more than just math), refusing to execute.';
}
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
}