首页 > 解决方案 > PHP:当只允许使用字母数字字符和运算符时,eval 函数是否足够安全?

问题描述

我正在考虑使用函数“eval”来评估用户生成的数学表达式。

但是,我被困住了。我知道如果我只允许数字和运算符(例如加号、减号等),那么 eval 是安全的。但是,我想让用户输入诸如 sin(x) 或 cos(x) 之类的函数,因此我需要允许解析器让字母进入。

安全吗?

用户能否输入仅包含字母数字字符和字符 {+、-、*、/}(不包括括号)的恶意代码?

谢谢你。

标签: phpparsingsecurityeval

解决方案


安全吗?

很难说需要看到实施,这不是你问题的一部分。

所以在这一点上,一切皆有可能。可能是安全的,可能是不安全的,可能是一团糟,也可能是金色的。

用户能否输入仅包含字母数字字符和字符 {+、-、*、/}(不包括括号)的恶意代码?

类似地,这取决于许多不同的事情,也许首先你会认为是恶意代码。能够触发错误的代码?

它也可以取决于 PHP 版本。一些较旧的 PHP 版本允许使用自动转换为字符串的未定义常量。

由于数字是允许的,一个允许的字符可能是. (点),它也是 PHP 中的字符串连接运算符,可能会导致您认为是恶意的副作用。

查看差异:https ://3v4l.org/Jkmj0


在您的具体情况下,为什么不查看已经建议的https://github.com/madorin/matex是否符合您的要求?

eval当您脱离等式时,这一次可能会使最初的“评估安全”问题变得无关紧要。


推荐阅读