1
$op=$_POST['param'];
$statement=eval("return ($op);");

在 'param' 中,如果有一个奇怪的字符,例如字母 'jfsdf' 或其他东西,则 eval 函数不起作用。我怎么解决这个问题?

eval 函数仅适用于明确定义的条目,例如 '54+4*3' 另一方面,如果它使用诸如 '6p+87+4' 之类的条目,则会给出解析错误。有什么方法可以警告用户以输入定义明确的语句

4

2 回答 2

2

首先,根据“奇怪”字符的含义,您应该实现验证来自外部的字符串的功能。

$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() 要非常小心 如果你在产品中使用这个函数,那么你做错了什么。

于 2012-06-11T20:23:32.153 回答
0

如果它是关于评估一个受约束的数学表达式,那么惰性选项将是在评估之前使用模式断言。这也更容易,因为它隐式返回表达式结果:

$result = preg_replace('#^\s*\d+([-+*/%]\s*\d+\s*)*$#e', '$0', $input);

如果您想断言(..)括号的结构也正确,则需要更复杂的东西。

如果不匹配,它将返回原始输入字符串。检查是否生成警告。

于 2012-06-11T19:11:15.430 回答