2016-09-28 12 views
0

mmプロジェクトでは、私は文字列である数式を評価したいと思います。例:"((1*10)/100) + 100"数式は文字列で構成されていますか?

このような公式はどのように評価できますか?私はeval()を使用しましたが、それはParse error: syntax error, unexpected end of fileエラーを投げており、evalは安全な機能ではありません。

私はそれを行うことができればとにかくですか? eval以外の方法がない場合はどうすればいいですか?なぜそれが投げたParse error: syntax error, unexpected end of file

+0

'EXEC()'数式の結果を計算しないように、コマンドを実行することを可能にするのに役立ちます。それはまったく違うものです。その文字列にはコマンドが含まれていないため、有効な構文はありません。 – arkascha

答えて

0

phpのexec()関数は、コマンドを実行し、数式や数式の結果を計算することはできません。それはまったく違うものです。その文字列にはコマンドが含まれていないので、有効な構文ではありません。

代わりにあなたの代わりに、数式のexec()へのお電話に有効なコマンドを供給する必要があります。

は、この単純な例を見てください:

<?php 
$input = '((1*10)/100) + 100'; 
echo exec('php -r "echo ' . $input . ';"'); 

これは明らかに、コマンドラインが必要ですあなたがhttpサーバ内からそれをトリガしようとした場合のために、PHPのバージョンはphpとして利用可能です。しかし、他の利用可能なインタプリタ、例えばbashを使っても同じことが可能です。

"インライン"代替(外部プロセスをフォークしないで)は、phpのeval()関数を使用することです。しかし、もう一度、式ではなくコマンドを入力する必要があります。利点は、実行時に他のツールやインタープリタを使用する必要がないことです。対応する例は次のようになります

<?php 
$input = '((1*10)/100) + 100'; 
echo eval('return ' . $input . ';'); 

両方スニペットの出力は明らか100.1です。

ただし、どちらの方法でも、実行に使用する式を完全に制御することが重要です。 ではなく、を使用すると、クライアント側の入力をこのフィルタされていないものに渡すことができます。これにより、攻撃者はシステム上で任意のコードを実行することができます!

0

これは、あなたが

echo eval('return '. "((1*10)/100) + 100" .';'); 
関連する問題