[Javascript] なぜGoogleはwhile(1); 彼らのJSONの回答に?


Answers

JSONハイジャックによるレスポンスの漏洩を防ぎます。

理論的には、HTTP応答の内容は同じオリジンポリシーによって保護されます。あるドメインのページは、明示的に許可されていない限り、他のドメインのページから情報を取得できません。

攻撃者は、 <script src=...> <img>タグや<img>タグを使用するなど、他のドメインのページをリクエストできますが、結果に関する情報(ヘッダー、コンテンツ)を取得することはできません。

したがって、攻撃者のページにアクセスした場合、gmail.comから電子メールを読み取ることができませんでした。

ただし、スクリプトタグを使用してJSONコンテンツをリクエストする場合、JSONは攻撃者の制御された環境でJavascriptとして実行されます。 攻撃者がArrayまたはObjectコンストラクタまたはオブジェクト構築中に使用された他のメソッドを置き換えることができる場合、JSON内のすべてのものが攻撃者のコードを通過して公開されます。

これは、JSONが解析された時点ではなくJavascriptとして実行されているときに発生することに注意してください。

複数の対策があります。

JSONが決して実行されないようにする

while(1);置くことによってwhile(1); JSONデータの前に、JSONデータが決してJavascriptとして実行されないようにします。

正当なページだけが実際にコンテンツ全体を取得し、 while(1);取り除くことができwhile(1); 残りをJSONとして解析します。

for(;;);ようなものfor(;;); Facebookなどでも同じ結果が見られました。

JSONが有効なJavascriptでないことを確認する

同様に、無効なトークンをJSONの前に追加すると、 &&&START&&&ように、決して実行されないことが確認されます。

JSONは常にオブジェクトを外側に返します

これは、JSONのハイジャックから保護するためのOWASP推奨方法であり、侵入しにくいものです。

これまでの対策と同様に、JSONがJavascriptとして実行されることはありません。

有効なJSONオブジェクトは、何も囲まれていない場合、Javascriptでは無効です。

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

しかしこれは有効なJSONです:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

そのため、レスポンスの最上位レベルで常にObjectを返すようにすることで、有効なJSONでありながらJSONが有効なJavascriptでないことを確認します。

コメントの@hvdで指摘したように、空のオブジェクト{}は有効なJavascriptであり、オブジェクトが空であることが重要な情報になることがあります。

上記の方法の比較

OWASPの方法は、クライアントライブラリを変更する必要がなく、有効なJSONを転送するので、侵入することが少なくなります。 しかし、過去または将来のブラウザのバグがこれを打ち負かすかどうかは不明です。 @oriadamが指摘しているように、エラー処理中にデータが解析エラーで漏洩する可能性があるかどうかは不明です(例:window.onerror)。

Googleの方法では、自動デシリアライゼーションをサポートするためにクライアントライブラリが必要であり、ブラウザのバグに関しては安全だと考えられます。

どちらの方法でも、開発者が偶然に脆弱なJSONを送信しないように、サーバー側の変更が必要です。

Question

なぜGoogleはwhile(1); JSONレスポンス(個人)に

たとえば、 Googleカレンダーでカレンダーをオンまたはオフにしているときの対応は次のとおりです。

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

私はこれが人々がeval()をやってしまうのを防ぐためだと思うだろうが、あなたがしなければならないことは、 while置き換えてからセットすることだ。 私は評価の妨げは、人々が安全なJSON解析コードを書くようにすることだと考えています。

私はこれを他のいくつかの場所で使用したことを見てきましたが、Google(メール、カレンダー、連絡先など)ではさらに多くのことが行われています。Google Docs&&&START&&&始まり、 while(1); &&&START&&& while(1); &&&START&&&

何が起きてる?




これは、サードパーティが<script>タグを使用してJSONレスポンスをHTMLドキュメントに挿入することを困難にすることです。 <script>タグは同じ原点ポリシーから免除されていることに注意してください。




<script >タグはWeb世界のセキュリティ上必要なSame Origin Policyから免除されているので、(1)JSONレスポンスに追加されると、 <script>タグに誤って使用されることはありません。