我有一个基于输入的字符串,如下所示:“34*(12+45.67)>=44-53”,我需要知道它的真假。那么,如果字符串只包含数字和 */+-().<>= 使用 eval 是否安全?或者也许有一些更好的解决方案?
6 回答
是的,对于不安全的输入,没有什么可以做的。只要您检查如下:
if( preg_match("([^0-9*/+().<>=-])",$input)) die("Invalid input");
然后你会没事的。但是,请注意输入必须在语法上正确。类似的东西>><>>><><>>>>>
会通过检查,但会导致错误。你应该try..catch
在你的eval
.
然而,理想情况下,如果可以的话,这真的应该在 JavaScript 中处理。可以eval
在用户自己提供的数据上使用。
为了安全起见,您可以删除不需要的字符:
$x = preg_replace('/[^0-9+\-\*\/()>=]/', '', $input);
eval($x);
这将删除任何不在0,1,2,3,4,5,6,7,8,9,0,/,+,-,*,(, or )
eval 的安全性取决于数据的来源和包含的内容。如果您确认它只包含数字和数学运算,那应该没问题。
请注意,您需要对其进行解析并将其转换为 PHP 语句,因为仅此一项总是会返回错误。记住 PHP 使用 == 进行比较,你需要一个或两个变量。
eval
如果您正在评估用户输入,它本身永远不会安全。如果你走这条路,那么所有的安全都取决于你。如果您的代码有能力在任何地方弄乱敏感的东西,那么祝您好运,并阻止恶意用户破坏您的应用程序的所有数千种方式。
否则,如果您所拥有的只是一个沙盒页面,无法触及服务器以挽救其生命,那么是的,您是安全的。
如果您的代码直接接受用户输入并对其进行评估:
eval($_POST['myInput'])
那么不,使用 eval 是不安全的。但是,您可以通过解析字符串(可能事先使用正则表达式)来确保使用 eval 的安全性。例如,确保它仅由数字、数学运算符和比较运算符组成可能会奏效。
当且仅当该字符串是
- 完全在您的控制下构建,无需复制用户输入;或者
- already parsed,因此您可以保证它始终仅包含有效顺序的数字和基本数学符号;
那么eval
是安全的。否则,至少,有人会触发解析错误。