PHP eval的限制

3

我需要评估一些逻辑表达式。在某些参数化后的表达式模板中,这些表达式可能如下所示:

$expr1 = '1 or 0 and not(0 or 0)';
$expr2 = "'editor' == 'editor' and not(0 = 1) and 10 > 5";

所以,我需要处理数字、字符串字面量,以及它们之间的逻辑和代数运算符和圆括号。

当使用 PHP eval 时,我还会获得不希望的不安全能力,比如系统函数调用等。

那么,有没有办法限制 PHP eval,或者可能有更好的解决方案呢?

谢谢!


2
你能否提供更多关于为什么需要 eval 的细节,以及你尝试做什么的一般信息?我不确定有一种有效的方法来限制 eval(在这种情况下,正则表达式既不高效也不理想),但很可能可以用除了 eval 之外的其他方法解决更大的问题。 - Ynhockey
"不受欢迎的不安全能力,例如系统函数调用。我不确定您的意思?您能详细说明一下吗?基本上,您需要小心评估的代码不会执行任何恶意操作。" - ScoPi
在字符串“/\w+\s\(”中,只允许“(and|or|not)\s\(”。请注意,这只是一个想法。您还需要防止所有类型的转义。 - John Dvorak
最好实现自己的解析器,而不是考虑使用“eval”。你几乎肯定会失败。https://dev59.com/6msz5IYBdhLWcg3wR1vC - Waleed Khan
我在我的访问控制系统中处理权限表达式字符串,可以看一下:https://github.com/nyan-cat/easyweb/wiki/Access-control-system。因此,在所有参数被替换为表达式字符串后,我需要以某种方式对其进行评估。在我的PHP引擎内部实现。 - nyan-cat
2个回答

3
你可以使用分词器检查表达式中是否包含函数调用。
请参考更安全的eval()类进行示例。

这里是所有PHP函数的列表:http://php.net/quickref.php - 但是每次检查该列表的所有条目不会太慢吗? - nyan-cat
您似乎不需要从您的帖子中使用函数,因此您不需要检查这个列表;您只需要禁止任何函数调用(即没有引号的 T_STRING 标记)。 - cmbuckley

3

好的,我有另一个解决方案。我意识到可以使用PHP DOMXPath :: evaluate来评估我的逻辑表达式。因此,我得到了一个可行的解决方案,没有安全问题。我认为我的问题已经解决了 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接