$op=$_POST['param'];
$statement=eval("return ($op);");
在 'param' 中,如果有一个奇怪的字符,例如字母 'jfsdf' 或其他东西,则 eval 函数不起作用。我怎么解决这个问题?
eval 函数仅适用于明确定义的条目,例如 '54+4*3' 另一方面,如果它使用诸如 '6p+87+4' 之类的条目,则会给出解析错误。有什么方法可以警告用户以输入定义明确的语句
$op=$_POST['param'];
$statement=eval("return ($op);");
在 'param' 中,如果有一个奇怪的字符,例如字母 'jfsdf' 或其他东西,则 eval 函数不起作用。我怎么解决这个问题?
eval 函数仅适用于明确定义的条目,例如 '54+4*3' 另一方面,如果它使用诸如 '6p+87+4' 之类的条目,则会给出解析错误。有什么方法可以警告用户以输入定义明确的语句
首先,根据“奇怪”字符的含义,您应该实现验证来自外部的字符串的功能。
$allowed_chars = array('function', 'this' ); //..add desirable ones
function is_alloved_char($char){
return in_array($char, $allowed_chars);
}
RegEx 非常适合当你这样做时,除了一些性能下降。
在您的情况下str_pos()
,足以匹配不受欢迎的字符。
所以,你的另一个功能应该类似于:
/**
*
* @param string
* @return TRUE on success, FALSE otherwise
*/
function is_really_safe($char){
global $allowed_chars; //just make this array visible here
foreach ($allowed_chars as $allowed_char){
if ( str_pos($allowed_char, $char) ){
return false;
}
}
return true;
}
另外,对 eval() 要非常小心 如果你在产品中使用这个函数,那么你做错了什么。
如果它是关于评估一个受约束的数学表达式,那么惰性选项将是在评估之前使用模式断言。这也更容易,因为它隐式返回表达式结果:
$result = preg_replace('#^\s*\d+([-+*/%]\s*\d+\s*)*$#e', '$0', $input);
如果您想断言(..)
括号的结构也正确,则需要更复杂的东西。
如果不匹配,它将返回原始输入字符串。检查是否生成警告。