$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);
}
正規表現は、パフォーマンスの低下を除いて、これに最適です。
あなたの状況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);
(..)
括弧も正しく構造化されていると主張したい場合は、もっと複雑なものが必要になります。
一致しない場合は、元の入力文字列を返します。警告を生成するためにそれを確認してください。