javascript评估简单用户提交的math节点.js

我需要评估一些简单的用户提交的math。 例如,乘以2个数字。

这打开了我注射攻击。

我的计划是在评估之前将一些值列入白名单[^|(|)|\d+|\*|\/|\+|-]并用正则expression式replace其他项。

这有什么问题?

示例string:

 324*32 (5+4-17) / 3 

我想不出有什么特别讨厌的方法来使用数字和less数几个操作符来搞乱你的服务器,但是,有一些事情你需要注意:

鉴于[^...]是一个字符类,您不需要用|分隔每个值 。 这可能是你真正想要的: [^^()\d*\/+-] 。 这将匹配你不想允许的一切。

此外,重要的是要记住,在JavaScript中, ^不代表权力,而是“排他性”。 这意味着,例如, 2 ^ 3 == 1 。 所以你可能不想白名单^[^()\d*\/+-]

你可能会遇到像(1 * (2 + 3)这样无效的语法,所以你应该留意这个,你可能只需要一个try catch块来处理类似的事情(把问题报告给用户东西)。