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块来处理类似的事情(把问题报告给用户东西)。