2015-09-26 82 views
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%安全,允許上述運行。

+4

eval'd語句中的捕獲錯誤是有問題的,而且最好還是hacky。我會看看一些數學解析庫。 – rjdown

+0

[ircmaxell的數學評估器庫](https://gist.github.com/ircmaxell/1232629)現在已經有點老了;但它仍然運作良好,並且比使用eval –

+2

哇更安全。這不僅僅是eval,而是雙重評估:php和shell! – melpomene

回答

1

我正在尋找固定代碼,以評估用戶輸入的公式以及。

你在做什麼似乎阻止任何用戶惡意代碼在你的服務器上運行,因爲他們只會被允許使用字母m,數字和數學運算符。

然而,它只是需要一個明亮的火花找到一個方法,妥協你的系統,我認爲大多數人會同意,允許用戶輸入被評估可能不是好的做法,不管你多少驗證它。

當我看着我的問題時,我開始尋找處理程序庫的公式,例如電子表格中使用的程序庫。 一個類似Excel的Excel會採用數學表達式並能夠安全地評估它們。

我從來沒有做過測試,但希望如果你能找到合適的,你甚至可以獲得與現有公式的向後兼容性。

祝你好運。

相關問題