【发布时间】:2014-02-07 21:50:07
【问题描述】:
我在这里建立了一个掷骰子:http://howderek.com/projects/diediedie/
我想实现数学,以便我的用户可以对他们的角色进行数学运算,这对 RPG 很有用。
我没有构建一个函数来处理数学,或者使用像 math.js 这样的库,我认为由于 JavaScript 内置了数学,这可能是 eval() 的一个很好的用途。
然而,我关心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() 中输入文本来运行代码。
【问题讨论】:
-
9发子弹的安全枪:)
-
@howderek 当然,但关键是要跳出框框思考。
-
你也可以使用worker来阻止你的应用中的全局代码修改和阻止广告的展示,去掉胡萝卜。
-
请注意,您的表达式也允许使用字符
|。|不是字符类中的交替字符。你的表达就是:/[^0-9+\-*\/().%><]/g -
@howderek 是否冒险由您决定。我们只能说,你不能做到万无一失。你可以编写一个语法并验证它,即使用pegjs.majda.cz 或类似的。
标签: javascript regex security xss