質問: なぜ、googleは(1)の間に付加するのですか。彼らのjsonレスポンスに? グーグルはなぜ彼らの(私的な)json応答にwhile(1);をつけるのですか?たとえば、これは google calendar でカレンダーをオン/オフにしたときの応答です。while(1);[['u',[['smssentflag','false'],['hideinvitations','false'], ['remindonrespondedeventsonly','true'], ['hideinvitations_remindonrespondedeventsonly','false_true'], ['calendar id stripped for privacy','false'],['smsverifiedflag','true']]]] 私はこれが人々がeval()を実行するのを防ぐためであると思いますが、あなたが本当にしなければならないのはwhileを置き換えることだけです。私は、eval防止は、人々が安全なjson構文解析コードを書くことを確実にすることであると思います。私はこれが他の場所でも使われているのを見たことがありますが、グーグル(メール、カレンダー、連絡先など)ではもっともっとそうです、 google docs は&&&start&&&で始まりますgoogleコンタクトはwhile(1); &&&start&&&で始まるようです。何が起きてる?
回答: jsonハイジャックによるレスポンスの漏洩を防ぎます。理論的には、http応答の内容は同じオリジンポリシーによって保護されています。1つのドメインからのページは他のドメイン上のページから情報を取得することはできません(明示的に許可されている場合を除く)。攻撃者があなたに代わって他のドメインのページをリクエストすることができます。 <script src=...>タグまたは<img>タグを使用しても、結果に関する情報(ヘッダー、コンテンツ)を取得できません。したがって、攻撃者のページにアクセスしても、gmail.comからあなたの電子メールを読むことはできません。ただし、jsonコンテンツを要求するためにscriptタグを使用する場合、攻撃者の制御された環境ではjsonがjavascriptとして実行されます。攻撃者がarrayやobjectのコンストラクタ、あるいはオブジェクトの構築中に使用されたその他のメソッドを置き換えることができる場合、json内の何かが攻撃者のコードを通過し、公開される可能性があります。これは、解析時ではなく、jsonがjavascriptとして実行されたときに発生することに注意してください。複数の対策があります。jsonが実行されないようにするjsonデータの前にwhile(1);ステートメントを配置することで、googleはjsonデータがjavascriptとして実行されないようにします。正当なページだけが実際にコンテンツ全体を取得し、while(1);を取り除き、残りをjsonとして解析することができます。例えば、facebookではfor(;;);のようなものが見られ、同じ結果が出ています。jsonが有効なjavascriptではないことを確認する同様に、&&&start&&&のように、jsonの前に無効なトークンを追加すると、それが実行されることはありません。常に外側にオブジェクトを付けてjsonを返すこれはjsonの乗っ取りから保護するための owasp 推奨される方法です そしてそれほど邪魔にならない方法です。これまでの対策と同様に、jsonがjavascriptとして実行されることは決してありません。何にも囲まれていない場合、有効なjsonオブジェクトはjavascriptでは無効です。eval('{"foo":"bar"}') // syntaxerror: unexpected token : しかしこれは有効なjsonです。json.parse('{"foo":"bar"}') // object {foo: "bar"} そのため、常にレスポンスのトップレベルでobjectを返すようにすると、jsonは有効なjavascriptではありませんが、それでも有効なjsonになります。コメントの@hvdで述べたように、空のオブジェクト{}は有効なjavascriptであり、オブジェクトが空であることを知ること自体が貴重な情報となるかもしれません。上記の方法の比較クライアントライブラリを変更する必要がなく、有効なjsonを転送するので、owaspの方法はそれほど邪魔になりません。しかしながら、過去または将来のブラウザのバグがこれを打ち負かすことができるかどうかは定かではありません。 @oriadamが指摘したように、エラー処理によって解析エラーでデータがリークされる可能性があるかどうかは不明です(たとえば、window.onerror)。グーグルの方法はそれが自動デシリアライゼーションをサポートするためにクライアントライブラリを必要とし、ブラウザのバグに関してより安全であると考えることができます。開発者が誤って脆弱なjsonを送信しないようにするために、どちらの方法でもサーバー側の変更が必要です。