2015-09-26 8 views
5

私は、 '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%安全であるかどうかを知りたい。

+4

evalされたステートメントのキャッチエラーは、問題があり、最高でもハックです。私はいくつかの数学解析ライブラリを見るだろう。 – rjdown

+0

[ircmaxellの数学評価ツールのライブラリ](https://gist.github.com/ircmaxell/1232629)は少し古くなっています。それでもうまく動作し、eval –

+2

Wowを使用するよりもはるかに安全です。これは単なる評価ではなく、二重評価です:phpとshell! – melpomene

答えて

1

私はユーザーが入力した公式を評価するコードを修正していました。

あなたがしていることは、m、数字、および数式演算子しか使用できないため、ユーザーの悪意のあるコードがサーバー上で実行されるのを防ぐためです。

しかし、あなたのシステムを危険にさらす方法を見つけるためには1つの明るいスパークが必要です。ユーザーの入力をeval'edにすることは、あなたがどれだけの妥当性を確認しても大したことではないでしょうそれ。

問題を調査していたときに、スプレッドシートで使用されているライブラリなどのライブラリを処理する数式を探し始めました。 Excelのようなライブラリは数式を取り、安全に評価することができます。

私はそれをテストすることは一度もありませんでしたが、うまくいけば正しいものを見つけることができれば、既存の数式との下位互換性を得ることさえできます。

幸運。

関連する問題