0

我有一个基于输入的字符串,如下所示:“34*(12+45.67)>=44-53”,我需要知道它的真假。那么,如果字符串只包含数字和 */+-().<>= 使用 eval 是否安全?或者也许有一些更好的解决方案?

4

6 回答 6

2

是的,对于不安全的输入,没有什么可以做的。只要您检查如下:

if( preg_match("([^0-9*/+().<>=-])",$input)) die("Invalid input");

然后你会没事的。但是,请注意输入必须在语法上正确。类似的东西>><>>><><>>>>>会通过检查,但会导致错误。你应该try..catch在你的eval.

然而,理想情况下,如果可以的话,这真的应该在 JavaScript 中处理。可以eval在用户自己提供的数据上使用。

于 2013-06-07T17:01:53.047 回答
1

为了安全起见,您可以删除不需要的字符:

$x = preg_replace('/[^0-9+\-\*\/()>=]/', '', $input);
eval($x);

这将删除任何不在0,1,2,3,4,5,6,7,8,9,0,/,+,-,*,(, or )

于 2013-06-07T17:04:51.610 回答
1

eval 的安全性取决于数据的来源和包含的内容。如果您确认它只包含数字和数学运算,那应该没问题。

请注意,您需要对其进行解析并将其转换为 PHP 语句,因为仅此一项总是会返回错误。记住 PHP 使用 == 进行比较,你需要一个或两个变量。

于 2013-06-07T16:58:47.067 回答
1

eval如果您正在评估用户输入,它本身永远不会安全。如果你走这条路,那么所有的安全都取决于。如果您的代码有能力在任何地方弄乱敏感的东西,那么祝您好运,并阻止恶意用户破坏您的应用程序的所有数千种方式。

否则,如果您所拥有的只是一个沙盒页面,无法触及服务器以挽救其生命,那么是的,您是安全的。

于 2013-06-07T16:59:01.483 回答
0

如果您的代码直接接受用户输入并对其进行评估:

eval($_POST['myInput'])

那么不,使用 eval 是不安全的。但是,您可以通过解析字符串(可能事先使用正则表达式)来确保使用 eval 的安全性。例如,确保它仅由数字、数学运算符和比较运算符组成可能会奏效。

于 2013-06-07T17:00:56.167 回答
0

当且仅当该字符串是

  • 完全在您的控制下构建,无需复制用户输入;或者
  • already parsed,因此您可以保证它始终仅包含有效顺序的数字和基本数学符号;

那么eval是安全的。否则,至少,有人会触发解析错误。

于 2013-06-07T17:01:33.243 回答