2011-09-12 9 views
3

PHPのjson_decode()はeval()とは対照的に安全ですか? eval()関数はコードを実行できますが、json_decode()も同様にコードを実行しますか?json_decodeセキュリティ

答えて

6

JSONはデータのみを表すことができるので、json_decodeはPHPコードを実行しません。

json_decodeの実装はバグがあり、任意の(バイナリで、唯一の)PHPコードの実行を許可することができます(例:buffer overflow)。比較的シンプルで広く使用されているコードのため、これは起こりそうもなく、PHPプログラムでは軽減するために行うことができません。

+1

+1のバグ。 PHPには良いセキュリティ履歴はありません。特に文字列ハンドラの多くは任意のメモリアクセスを許可しています。 Exploitable PHP functions http://stackoverflow.com/questions/3115559/exploitable-php-functions/3451100#answer-3697776の質問の情報を参照してください。 5.2.9未満のPHPバージョンでは、悪質な攻撃者がjson_decode()を使用してサービス拒否を引き起こす可能性があります。 CVE 2009-1271を参照してください。http://osvdb.org/52486 完全に信頼できないデータについては、私はいつも自分自身で少なくとも完全な形式の検証を試みます。 – Cheekysoft

+0

これは有用な答えではありません。問題は 'json_decode'がバグで、任意のコードを実行できるかどうかということです。あなたはその質問に答えなかった。 –

+0

D.W. OPが明示的に否定的な例(任意のコード実行、任意の* php *コードの実行を可能にすることを意図したものではない)として明示的に言及したので、彼はPHP実装でバグを考慮しなかったと思う。また、あなたのコメントを完全に誤読していない限り、この答えの2番目の段落は、「json_decodeがバグかもしれないし、任意のコードの実行を許可するかどうか」と正確に答えます。私はこの答えを明確にするために何が改善できるか困惑している。ヒントを教えてもらえますか? – phihag

1

eval()json_decode()は2つの異なる機能ですが、なぜあなたはそれらが似ていると思いますかわかりません。 1つは文字列をPHPコードとして評価し、もう1つはJSON文字列をデコードします。 json_decodeを実行すると何も実行されません。

+1

おそらく、OPはJavascriptでeval()とPHPでeval()を混同している可能性があります。 Javascriptでeval()はJSONをオブジェクトに変換するPHPでjson_decode()を実行し、文字列を評価してコードとして実行できるようにします。 –