My Spider Senseは、着信JSONの解析にeval()
を使用すると悪いことを警告します。私はちょうどJSON.parse()
- 私はJavaScriptの一部であり、ブラウザ固有の機能ではない - より安全だと思います。JSON.parseとeval()
答えて
あなたはより脆弱であるように(インラインドキュメントhereで詳細および例)日付時刻などの特定の値に対処する方法を指定できますaditionalパラメータ、リバイバーを受け付けますを使用している場合、攻撃:JSONはJavaScriptのサブセットで、json.parseはJSONを解析しますが、eval
はすべてのJS式を開いたままにします。
JSONはJavaScriptの一部です。しかし、eval
はJSONのサブセットだけでなく、完全なJavaScript言語を評価します。
右、私はそれを知っています。 JSON.parse()がJSONのみを評価し、他のすべての受信データで失敗することを暗示していますか?または、それは単なるラッパーです: var myObject = eval( '(' + 'responseText +') '); ?? –
@ケビン・メジャー:はい、ネイティブに実装された 'JSON.parse'(JavaScriptエンジンに直接実装されています)はJSONのみを解析します。しかし、他の非ネイティブな実装では、いくつかのサニティチェックを行い、パフォーマンス上の理由から 'eval'を使用します。 – Gumbo
JSONをeval
で解析すると、解析される文字列に絶対に何かが含まれるようになります。そのため、データセットではなく、関数呼び出しなどを実行することができます。また
parse
あなたは
すべてのブラウザでネイティブJSONがサポートされているわけではないため、JSON文字列にeval()
を使用する必要がある場合があります。 http://json.orgのJSONパーサを使用すると、すべての処理が簡単になります。
は悪ですが、一部のブラウザに対しては必要な悪いことがありますが、避けることができる場所はありません!!!!!
すべてJSON.parse
実装最も可能性の高い使用eval()
JSON.parse
はline 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の構文で確認することです。
JSON.parse()とeval()が受け入れるものには違いがあります。この上evalを試してみてください:
VARのx = "{\" shoppingCartName \ ":\" shopping_cart:2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
このexampleを参照してください。
evalは文字列をコード・ステートメントとして解析するため、値宣言式ではなくコード式として「{...}」を考慮して機能しません。あいまいさ(例えば、[[.... ....] ")を削除すると、式の性質に疑いがなくなり、evalは解析されたobjet –
はいを含む配列を作成します。伝統的に、xは括弧で囲まれています:eval( "(" + x + ")")。私が言ったことはまだあります:JSON.parse()を使うときにあいまいさはありません。 –
- 1. のeval()に動作しますが、JSON.parse()と$ .parseJSON()
- 2. JSON.parseとJSON.stringify
- 3. PHP json_encode()とJavascript JSON.parse()
- 4. JSON.parse
- 5. JSON.parse
- 6. 珍しいJSON.parseパラメータ:JSON.parse(<?= data; ?>)
- 7. ASP:LinkButtonとEval
- 8. Eval()と式コード
- 9. Python eval()とexec()
- 10. Redis evalコマンドとトランザクションコマンド
- 11. Evalとhref属性?
- 12. JSON.parse not running
- 13. React:Immutable.js対JSON.parse(JSON.stringify())
- 14. JSON.parseがエラー
- 15. JavascriptをJSON.parseアポストロフィ
- 16. JSON.Parse Returns Undefined
- 17. JSON.parseは、HTMLコンテンツ
- 18. JSON.parse(データ)は、エラー
- 19. JSON.parseエラーJavascript
- 20. JSON.parse get value
- 21. JSON.parse()でエスケープする
- 22. オブジェクト配列のJSON.parse
- 23. JSON.parseが正しく
- 24. Node.jsのJSON.parse問題
- 25. eval( 'break')とeval( 'continue')はなぜ失敗するのですか?
- 26. Node.JS vm.runInNewContext()vs require()とeval()
- 27. テキストラベルプロパティASP.Netのevalとアンカータグhref
- 28. Eval()とExpression Treeの比較
- 29. ループ内のevalとsetTimeout
- 30. eval() - eval() 'dコードの解析エラー
*「あなたは攻撃に対してより脆弱です」*、私は完全に反対です! – Hydro
申し訳ありませんが、Matheus、私は同意する必要があります。問題は、eval()を使用して "ユーザー入力"を解釈しているときです。これはJavaScriptからの外部ソースです(呼び出されたサーブレットや他のWebサービスからの戻り値を含む)。ユーザーが悪意のあるJavaScriptをクライアントアプリケーションに直接入力していないことや、サーバーのデータベースに格納されている無効なデータがAJAX形式の呼び出しによってプログラムに渡されたため間接的に悪質なJavaScriptが入力されたことを保証することはできません。 「混乱した代理」攻撃を避けるためには、個々のフィールドを検証する必要があるかもしれませんが、JSON.parseを使用するのは良い第一歩です。 – JackLThornton
@Hydro概念の短い証明: 'eval( 'alert(1)');'を試してください。 –