是否安全使用" eval"?

时间:2013-06-07 16:56:13

标签: php eval

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

6 个答案:

答案 0 :(得分:2)

是的,没有什么可以用不安全的输入完成。只要你检查如下:

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

如果您正在评估用户输入,那么

eval 永远不会安全。如果您遵循该路径,那么所有安全性都取决于。如果你的代码有能力在任何地方搞乱敏感的东西,那么祝你好运,并防止恶意用户数以万种方式搞砸你的应用程序。

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

答案 3 :(得分:1)

你可以删除你不想要的字符,只是为了安全:

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

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

以外的所有内容

答案 4 :(得分:0)

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

eval($_POST['myInput'])

然后不,使用eval是不安全的。但是,您可以通过解析字符串来安全地使用eval,可能事先使用正则表达式。例如,确保它仅由数字,数学运算符和比较运算符组成,可能会起到作用。

答案 5 :(得分:0)

当且仅当该字符串为

  • 完全由您控制,无需复制用户输入;或
  • 已经解析,以便您可以保证它始终只包含有效订单中的数字和基本数学符号;

然后eval是安全的。否则,至少有人可以触发解析错误。