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