2013-02-06 72 views
26

讀取this問題,即爲什麼谷歌/ Facebook的等添加不可解析多餘的內容等之後:JSON unparseable cruft:爲什麼這麼認真?

  • while(1);
  • for(;;);
  • &&&START&&& ... &&&END&&&
  • 1和3相結合

其JSON迴應,我已經理解了動機。但我仍然不清楚爲什麼這樣相對複雜的機制被使用,當類似的效果可以用的東西像

  • 在開始添加額外的)渲染無效的整條生產線有語法錯誤
  • 實現
  • 在評論

現在包裝的JSON,似乎這增加了一個無限循環和(怪異)語法錯誤的保護,就會得到解決老年人和寬容的JavaScript解析器,但我似乎無法找到指示任何引用這是事實。還有另一個SO question繼續解決while(1);解決方法(聲明1可以被破壞)並拒絕{}&&形式的另一個解決方法,但不能解釋爲什麼或引用任何來源。

其他參考資料:

+0

只是我還是這樣覺得安全通過默默無聞,甚至不會成爲任何合理編寫的XSS漏洞的問題? JSON.parse()實際上是否調用eval()? –

+0

一個相關的問題是爲什麼他們不只是返回JSON對象而不是數組。返回一個對象會產生完全有效的JSON,這是無效的Javascript,以更清晰的方式阻止JSON劫持。可能的答案是這些服務試圖以儘可能緊湊的格式返回以節省帶寬。大多數Web服務的運行規模並不那麼大,可以避免這種優化。 –

回答

10

我認爲有相關的無法解析的克魯夫特的形式幾個細節:到JSON解析器(在舊版本顯然&例如道場)未驗證JSON字符串作爲有效

  • {}&&前綴追溯到JSON句法。我所知道的所有JSON解析器庫現在都在進行驗證,但從2008年的this blog post表明,所述版本的dojo將允許JSON.parse通常爲json,而eval只會失敗,這會爲您提供對JSON劫持的方便保護。

  • while(1)可以使用Number原型進行無效的,通過如1的值分配0

  • for(;;)while(1)都會影響被劫持的站點,因爲任何腳本的每個進一步執行都會被有效地停止而沒有錯誤,所以這會增加保護。這很重要,因爲根據定義,錯誤根本沒有在腳本執行結束時標記爲javascript,而for(;;)確保腳本沒有執行任何腳本。這是爲了防止攻擊者通過利用window.onerror中的弱點,覆蓋eval或代理錯誤對象實例化(例如覆蓋Error.prototypeconstructor)成功攔截腳本錯誤的情況(afaik假設)。

    UPDATE

    還有this question on security.stackexchange建議不使用for(;;)while(1),因爲它可以暗示你的網站是拒絕服務攻擊的客戶端CPU或觸發惡意軟件掃描。我沒有看到現代瀏覽器出現嚴重的DoS問題,因爲他們運行沙盒和每個Tab選項。但它確實是舊版瀏覽器的問題。惡意軟件掃描程序是一個真正的問題,可能會將您的網站報告爲攻擊。

  • &&&START&&&(以及相應的&&&END&&&標籤)使在客戶端解析接收的JSON比只使用)或評論說,可能會無意中關閉更容易,並且可以提高可讀性&知名度的程序員。在評論中包裝只是其中的一種變體,因爲它提供了/*開始和*/結束標記。在我看來,在開始和結束時有一個清晰明確的標記,有助於注意到殘留物的含義。使用評論並不是真的提供這一點。

3

關於 '1可以打一頓':

,如果你做的以下(在webkit中):

var test = 1; 
console.log(test.constructor == window.Number); //true is logged 

在理論上有可能是一個可能性,那有修改window.Number或它的原型方式,使的1值不會1

window.Number.prototype.toString = function() { return 0 }; 
window.Number.prototype.valueOf = function() { return 0 }; 

這個幸運的是行不通的。但我認爲那是作者想要說的。

編輯 通常我也傾向於使用這種方法,你包裹內容爲註釋(但隨後必須保證您的JSON對象不包含這樣的事情{"test":"*/"},因爲這將創建一個語法錯誤那麼即使是一個拋出的錯誤也可能是一個問題,如果它是可捕獲的並且可能暴露關於發生錯誤的行的一些信息,或者如果錯誤對象本身可以被改變。

+0

關於嵌入式「* /」的好處,實際上並沒有想到 – Manav

+0

,您關於語法錯誤泄漏信息的觀點可能就是爲什麼僅僅爲JSON添加無效字符串的前提是一個壞主意。因此,我排除了第一個選項(在JSON之前使用一個簡單的''''前綴)「,而後者是什麼?&&& START &&&&&&&&& END &&&''在做什麼。 – Manav

+0

@Manav好了一件事,但這只是一個猜測,使用'for(;;)'或'while(1)'與'&&& START &&&'結合起來就是首先嚐試停止腳本的執行,語法錯誤。如果這不起作用,至少可以阻止惡意網站的無限循環。但說實話,我還需要再做一些進一步的閱讀。但我認爲所有可能被解析爲代碼或拋出異常的東西都可能是壞的。 –