為什麼谷歌的JSON響應以while(1);開頭?

ourjs發表於2014-01-11

  問題(QUESTION):

  我有個問題一直很好奇就是:為什麼谷歌的JSON響應以while(1);開頭?舉個例子,當把谷歌日曆開啟和關掉時,會返回這樣的JSON物件:

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

  覺得這是谷歌不推薦使用eval()函式。我們需要做的是取代while,然後設定。我認為避免使用eval()函式是為了用eval()函式來確認JSON格式的字串是否正確,從而確保程式設計師寫出安全的JSON解析程式碼。我在其他一些地方也見過這個用法,但更多的是在谷歌的產品中,像谷歌的郵件、日曆、通訊錄等。

  說來也奇怪,谷歌文件以&&&START&&&開頭,但谷歌通訊錄卻以while(1);&&& START&&&開頭。有人知道這是為什麼嗎?

  回答1:

  這可以防止JSON劫持。舉個不是很恰當的例子:谷歌有一個URL:mail.google.com/json?Action=inbox ,在JSON格式下,它可以讀取你的收件箱內前50條訊息。由於同源策略,其他域內的壞網站卻不能發出AJAX請求,以獲取這些資料,但是他們可以通過重寫全域性陣列建構函式或者存取函式,使cookies和URL間可以有一種方法,無論何時設定一個物件(陣列或雜湊)的屬性,都允許他們讀取JSON內容。

  while(1); 或者&&&BLAH&&& 可以防止mail.google.com上的一條AJAX請求,擁有對於文字內容的全部訪問許可權,並且能夠將其撤銷。但是同時,一 個 SCRIPT 標籤的插入會在無需任何處理的情況下,盲目地執行JavaScript,最終可能導致死迴圈或語法錯誤。同時這也並不能解 決偽造的跨站請求問題。

  回答2:

  這是為了確保讓其他網站不能偷取你的資訊。例如,先 通過替換陣列構造器,再通過一個 SCRIPT 標籤包含這個JSON URL,惡意的第三方網站就可以從JSON響應盜取資料。把while(1);放在開頭就可以解決這樣的問題。在另一方面,來自同一個網站使用XHR和獨 立的JSON解析器的請求,可以直接忽略while(1);。

  回答3:

  這將會給使用 SCRIPT 標籤的第三方網站在HTML文件中插入JSON響應變得困難。值得注意的是, SCRIPT 標籤
是不需要被Sa授權的哦。

  回答4:

  這可以防止被當作一個簡單 SCRIPT 標籤目標。這樣的話,壞傢伙就不能輕而易舉地把指令碼標籤放到他們自己的網站,利用活動會話而有機會偷取你的資料。

  原文 stackoverflow.com

相關文章