如何安全地评估用户输入表达式

时间:2016-08-13 08:17:32

标签: javascript node.js

我想解析用户使用标准javascript验证布尔值的表达式,如:

var1 > obj1.prop1 && var2 + 1 <= 5

由于这个表达式是由用户编写的,我想确保它们是干净的,因为它们将被NodeJS评估为服务器端。

有没有一种方法可以使用Node的功能直接评估表达式而不需要代码注入的风险,而不必将表达式解析为文本寻找模式并重新发明轮子?

2 个答案:

答案 0 :(得分:3)

你可能不喜欢这个答案。但你必须做好工作。没有灵丹妙药。

您的问题与要求“标准javascript”和“没有代码注入风险”相矛盾。你不能两者兼得。标准JavaScript允许使用'require("fs").rmdirSync("/")'

等表达式

用户输入的表达式必须限制在严重受限的JavaScript子集中。在尝试评估输入之前,服务器必须验证输入是否仅限于此子集。

首先,您需要仔细考虑允许的有限子集。看起来你想要允许常数整数,如'5',运算符如'&gt;','&amp;&amp;'和'&lt; ='。您还允许访问'var1''obj1.prop1''var2'等变量。我想你需要对允许变量列表非常具体。

防止脚本注入的关键是定义一个仅包含您知道安全的事物的子集。你不应该尝试从整个JavaScript开始并排除你认为危险的东西 - 因为你会错过一些。

一旦仔细定义了表达式可能包含的内容,就需要实现解析和验证表达式的代码。您可以找到库或标准代码来执行此操作,但您必须修改或配置它以允许您的特定要求。

答案 1 :(得分:0)

您可以使用随附的mathjs库自带的表达式解析器。

网站:http://mathjs.org/