2009-12-03 19 views
83

My Spider Senseは、着信JSONの解析にeval()を使用すると悪いことを警告します。私はちょうどJSON.parse() - 私はJavaScriptの一部であり、ブラウザ固有の機能ではない - より安全だと思います。JSON.parseとeval()

答えて

97

あなたはより脆弱であるように(インラインドキュメントhereで詳細および例)日付時刻などの特定の値に対処する方法を指定できますaditionalパラメータ、リバイバーを受け付けますを使用している場合、攻撃:JSONはJavaScriptのサブセットで、json.parseはJSONを解析しますが、evalはすべてのJS式を開いたままにします。

+0

*「あなたは攻撃に対してより脆弱です」*、私は完全に反対です! – Hydro

+2

申し訳ありませんが、Matheus、私は同意する必要があります。問題は、eval()を使用して "ユーザー入力"を解釈しているときです。これはJavaScriptからの外部ソースです(呼び出されたサーブレットや他のWebサービスからの戻り値を含む)。ユーザーが悪意のあるJavaScriptをクライアントアプリケーションに直接入力していないことや、サーバーのデータベースに格納されている無効なデータがAJAX形式の呼び出しによってプログラムに渡されたため間接的に悪質なJavaScriptが入力されたことを保証することはできません。 「混乱した代理」攻撃を避けるためには、個々のフィールドを検証する必要があるかもしれませんが、JSON.parseを使用するのは良い第一歩です。 – JackLThornton

+0

@Hydro概念の短い証明: 'eval( 'alert(1)');'を試してください。 –

4

JSONはJavaScriptの一部です。しかし、evalはJSONのサブセットだけでなく、完全なJavaScript言語を評価します。

+0

右、私はそれを知っています。 JSON.parse()がJSONのみを評価し、他のすべての受信データで失敗することを暗示していますか?または、それは単なるラッパーです: var myObject = eval( '(' + 'responseText +') '); ?? –

+5

@ケビン・メジャー:はい、ネイティブに実装された 'JSON.parse'(JavaScriptエンジンに直接実装されています)はJSONのみを解析します。しかし、他の非ネイティブな実装では、いくつかのサニティチェックを行い、パフォーマンス上の理由から 'eval'を使用します。 – Gumbo

9

JSONをevalで解析すると、解析される文字列に絶対に何かが含まれるようになります。そのため、データセットではなく、関数呼び出しなどを実行することができます。また

、JSONの parseあなたは

13

すべてのブラウザでネイティブJSONがサポートされているわけではないため、JSON文字列にeval()を使用する必要がある場合があります。 http://json.orgのJSONパーサを使用すると、すべての処理が簡単になります。

​​は悪ですが、一部のブラウザに対しては必要な悪いことがありますが、避けることができる場所はありません!!!!!

29

すべてJSON.parse実装最も可能性の高い使用eval()

JSON.parseline 497上で右そこeval()を使用する、Douglas Crockford's solutionに基づいています。

// In the third stage we use the eval function to compile the text into a 
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity 
// in JavaScript: it can begin a block or an object literal. We wrap the text 
// in parens to eliminate the ambiguity. 

j = eval('(' + text + ')'); 

JSON.parseの利点は、引数が正しいJSONの構文で確認することです。

+50

ええ、それの前の行は、安全で有効な文字列であることを確認しています。 – nickf

+3

LinuxのMintシステムのFirefox 28とChromium 33で 'JSON.parse()'をテストしました。 Firefoxでは 'eval()'の2倍、Chromiumでは4倍速かった。あなたが投稿しているソースコードはわかりませんが、私のブラウザでは同じものではありません。 – jbo5112

+0

@plodder "有利な"おそらく安価ではないことを確認することです。 – momomo

9

JSON.parse()とeval()が受け入れるものには違いがあります。この上evalを試してみてください:

VARのx = "{\" shoppingCartName \ ":\" shopping_cart:2000 \ "}"

eval(x)   //won't work 
JSON.parse(x) //does work 

このexampleを参照してください。

+1

evalは文字列をコード・ステートメントとして解析するため、値宣言式ではなくコード式として「{...}」を考慮して機能しません。あいまいさ(例えば、[[.... ....] ")を削除すると、式の性質に疑いがなくなり、evalは解析されたobjet –

+1

はいを​​含む配列を作成します。伝統的に、xは括弧で囲まれています:eval( "(" + x + ")")。私が言ったことはまだあります:JSON.parse()を使うときにあいまいさはありません。 –