5
我正在使用用戶提供的字符串,如'm * 0.2',其中'm'爲$value
並評估字符串。用戶可以使用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'd語句中的捕獲錯誤是有問題的,而且最好還是hacky。我會看看一些數學解析庫。 – rjdown
[ircmaxell的數學評估器庫](https://gist.github.com/ircmaxell/1232629)現在已經有點老了;但它仍然運作良好,並且比使用eval –
哇更安全。這不僅僅是eval,而是雙重評估:php和shell! – melpomene