2

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

关键是我不完全确定如何解析用户提供的函数。用户基本上可以将他想要的所有东西放在一个函数中,这可能会产生我的网站被更改等的效果。

eval()根本不安全;两者都不是new Function(),因为两者都可以使用户在功能中随心所欲。通常JSON.parse()是一个很好的替代方法eval(),但是 JSON 中不存在函数。

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

4

4 回答 4

1

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

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

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

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

假设如果有人毁了你的狗屎你不希望世界崩溃,你可以通过简单地检查关键字并禁止包含在and中的任何逻辑代码块来开发一个足够好的解决方案function{}

于 2011-03-22T14:07:52.393 回答
1

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

于 2011-03-22T14:08:49.830 回答
1

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

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

于 2011-03-22T14:10:06.480 回答
0

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

if(!/^[a-zA-Z\|\&\!\(\)\ ]+$/.test(str)) {
   throw "The function is not a combination of Boolean operators.";
   return;
}
于 2011-03-22T15:20:58.250 回答