我需要评估一些简单的用户提交的数学。例如,2 个数字的乘法。
这使我容易受到注入(inject)攻击。
我的计划是将一堆值列入白名单[^|(|)|\d+|\*|\/|\+|-]
,并在评估之前用正则表达式替换其他所有内容。
这有什么问题吗?
示例字符串:
324*32
(5+4-17) / 3
最佳答案
我想不出任何特别令人讨厌的方法来仅使用数字和少数运算符来过多地搞乱您的服务器,但是,您需要注意一些事情:
鉴于 [^...]
是一个字符类,您不需要用 |
分隔每个值。这可能是您真正想要的:[^^()\d*\/+-]
。这将匹配您不想要允许的一切。
此外,请务必记住,在 JavaScript 中,^
并不代表幂,而是代表“异或”。例如,这意味着 2 ^ 3 == 1
。因此,您可能不想将 ^
列入白名单:[^()\d*\/+-]
。
您可能会遇到像 (1 * (2 + 3)
这样的无效语法,因此您也应该注意这一点。您可能只需要一个 try catch block 并有意义地处理类似的事情(将问题报告给用户或其他东西)。
关于javascript 评估用户提交的简单数学node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6043874/