なぜGoogleはJSONレスポンスの前にwhile(1);をつけるのか?

なぜGoogleは(非公開の)JSONレスポンスに「while(1);」を前置するのですか?

例えば、Googleカレンダーでカレンダーをオン・オフしている間のレスポンスは以下の通りです。

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 Contactsでは while(1); &&&START&&& で始まるようです。

どうなっているのでしょうか?

これは、他のサイトがあなたのデータを盗もうとするような悪質ないたずらをしないようにするためです。例えば、配列のコンストラクタを置換した後、このJSONのURLを<script>タグで含めると、悪意のある第三者のサイトがJSONのレスポンスからデータを盗むことができます。最初に while(1); を置くことで、スクリプトは代わりにハングアップします。

一方、XHR と別の JSON パーサーを使用する同一サイトからのリクエストでは、while(1); のプレフィックスを簡単に無視することができます。

解説 (10)

それは、サードパーティがJSONレスポンスをHTMLドキュメントに<script>タグで挿入することを困難にすることです。なお、<script>タグはSame Origin Policyの対象外となっています。

解説 (4)

:2019年現在、この質問で取り上げられている予防策につながる古い脆弱性の多くは、モダンブラウザでは問題にならなくなっています。 歴史的な好奇心として以下に回答を残しておきますが、本当にこのトピック全体は、これが質問された2010年(!)以降、根本的に変化しています。


単純な <script> タグのターゲットとして使用されるのを防ぎます。(そうすれば、悪者が自分のサイトにscriptタグを置いて、アクティブなセッションに頼ってコンテンツを取得することができなくなります。

edit — コメント(と他の回答)に注意してください。問題となるのは、組み込まれている機能、特に ObjectArray コンストラクタの破壊です。これらは、無害なJSONが解析されたときに、攻撃者のコードを引き起こすように変更することができます。

解説 (1)