如何让用户安全地输入JavaScript函数?

时间:2011-03-22 14:03:23

标签: javascript parsing function boolean truthtable

我正在做的是创建一个真值表生成器。使用用户提供的功能(例如a && b || c),我试图让JavaScript显示a,b和c的所有组合以及函数的结果。

关键是我不完全确定如何解析用户提供的功能。用户可以基本上将他想要的所有内容放在一个函数中,这可能会影响我的网站的更改等。

eval()根本不安全;两者都不是new Function(),因为两者都可以使用户在函数中按照自己的喜好放置所有内容。通常JSON.parse()eval()的绝佳替代品,但JSON中不存在函数。

所以我想知道如何将自定义布尔运算符字符串如a && b || c解析为函数,同时忽略任何恶意代码字符串。在函数内只允许使用布尔运算符(&&, ||, !)。

4 个答案:

答案 0 :(得分:1)

即使你检查布尔表达式,我也可以这样做:

(a && b && (function() { ruinYourShit(); return true; })())

这是为了说明在一般情况下您的问题无法解决。

为了使它适用于您的情况,您必须对变量命名施加严格限制,例如要求所有变量都是单个字母,然后使用正则表达式将其踢回来(如果找到其他任何内容)。另外,为了“匹配”一个布尔表达式,你实际上必须为该表达式开发一个语法。您正在尝试解析非常规语言(javascript),因此您无法编写可以匹配任意复杂性的每个可能布尔表达式的正则表达式。基本上,你要解决的问题确实非常困难。

假设你没有想到如果有人破坏你的狗屎就会崩溃,你可以通过简单地检查function关键字并禁止任何关键词来制定一个足够好的解决方案 {}中包含的逻辑代码块。

答案 1 :(得分:1)

我没有看到使用eval()并让用户做任何他想做的事情的问题,只要你在任何期望输入的服务器端脚本上有适当的验证/过滤器。当然,用户可以做一些破坏页面的事情,但是他已经可以做到了。用户可以使用任意数量的内置浏览器功能或附件轻松地在您的页面上运行他想要的任何javascript。

答案 2 :(得分:1)

我要做的是首先将用户输入拆分为标记(变量名称,运算符和可能用于分组的括号),然后从中构建表达式树,然后从表达式树生成相关输出(可能在运行之后)对它的一些简化)。

因此,比如说,将字符串“a&!b”分解为令牌序列“a”“&” “!” “b”,然后通过并(最终)构建类似:booland(boolvar(“a”),boolnot(boolvar(“b”)))然后你有一个合适的数据结构来运行你的(自定义,希望注入 - 免费)评估员结束。

答案 3 :(得分:0)

我最后得到了一个正则表达式:

if(!/^[a-zA-Z\|\&\!\(\)\ ]+$/.test(str)) {
   throw "The function is not a combination of Boolean operators.";
   return;
}