私は、 'm *'が$value
で、文字列を評価する 'm * 0.2'のようなユーザー提供の文字列を取っています。ユーザーは、4つの基本演算子、小数点、および負の数を使用できます。何か他のものを使用しようとする試みは省略される。このように方程式を処理するのは安全ですか?
$equation = $metric['formatter'];
$equation = preg_replace("/[^0-9*m.\/\+\-]/", "", $equation); //strips extra params
if (strlen($equation) > 1) {
$equation = str_replace("m", ' $value ', $equation);
$code = '$newValue = '.$equation.';';
if (validExec($code)) { //validates syntax
eval($code);
$newValue = (int) $newValue; //unnecessary security step?
if ($newValue != 0) {
$value = $newValue;
}
}
}
function validExec($code) {
$code = escapeshellarg('<?php ' . $code . ' ?>');
$lint = 'echo $code | php -l'; // command-line PHP
// maybe there are other messages for good code?
return (preg_match('/No syntax errors detected in -/', $lint));
}
私の方法が上記を実行することを許可する上で100%安全であるかどうかを知りたい。
evalされたステートメントのキャッチエラーは、問題があり、最高でもハックです。私はいくつかの数学解析ライブラリを見るだろう。 – rjdown
[ircmaxellの数学評価ツールのライブラリ](https://gist.github.com/ircmaxell/1232629)は少し古くなっています。それでもうまく動作し、eval –
Wowを使用するよりもはるかに安全です。これは単なる評価ではなく、二重評価です:phpとshell! – melpomene