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);
}

正規表現は、パフォーマンスの低下を除いて、これに最適です。

あなたの状況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 に答える