2013-05-22 56 views
13

有時候我see在查看源代碼網頁(HTML查看源)驗證碼:JSON.stringify和「 u2028 u2029」檢查?

if (JSON.stringify(["\u2028\u2029"]) === '["\u2028\u2029"]') JSON.stringify = function (a) { 
    var b = /\u2028/g, 
     c = /\u2029/g; 
    return function (d, e, f) { 
     var g = a.call(this, d, e, f); 
     if (g) { 
      if (-1 < g.indexOf('\u2028')) g = g.replace(b, '\\u2028'); 
      if (-1 < g.indexOf('\u2029')) g = g.replace(c, '\\u2029'); 
     } 
     return g; 
    }; 
}(JSON.stringify); 
  • 什麼是JSON.stringify(["\u2028\u2029"]),它需要進行檢查的問題?

附加信息:

  • JSON.stringify(["\u2028\u2029"])值爲"["

"]"
  • '["\u2028\u2029"]'值也是"["

"]"
+0

相關http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/和https://code.google.com/p/v8/issues/detail?id = 1907 – andyb

回答

7

我認爲這可能是一個安全功能。 FileFormat.info爲20282029有一面旗幟,說明

不要在域名使用該字符。瀏覽器有blacklisting,這是因爲潛在的網絡釣魚。

但事實證明,行和段落分隔\u2028\u2029分別爲ES5的JavaScript新行處理。

http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/

\ u2028和\ u2029的字符,可以打破整個JSON源,因爲該字符串將包含新線和JavaScript分析器會擺脫困境

所以你看到了補丁爲JSON.stringify。另請參閱Node.js JavaScript-stringify

編輯:是,現代瀏覽器的內置JSON對象應該正確地照顧這一點。儘管如此,我找不到任何指向實際源的鏈接。 Chromium code search沒有提及任何會保證手動添加此解決方法的錯誤。它看起來像Firefox 3.5是第一個具有本機JSON支持的版本,但是not entirely雖然沒有bug。 IE8也支持它。所以這可能是一個不必要的補丁,假設瀏覽器正確實施了規範。

+0

在瀏覽器中內置JSON對象 - 已經爲我們照顧它了嗎?如果是 - 爲什麼我需要支票? –

+0

我已經給答案添加了一些額外的細節。簡而言之,你可能不需要現代瀏覽器中的補丁。 – andyb

1

\u2028\u2029是不可見的Unicode lineparagraph分隔符。原生JSON.stringify方法將這些代碼轉換爲它們的符號表示形式(因爲JavaScript自動在字符串中執行),結果爲"["

"]"。您提供的代碼不允許JSON將代碼轉換爲符號並在輸出字符串中保留其\uXXXX表示形式,即返回"["\u2028\u2029"]"

+0

如果它是默認的,那麼爲什麼要進行檢查? –

+0

@RoyiNamir檢查功能是否已被覆蓋的情況。 – VisioN

+0

謝謝。所以整個想法是**保留這些角色的原始意義? –

3

閱讀兩個答案後,這裏是簡單的可視化解釋:

這樣

alert(JSON.stringify({"a":"sddd\u2028sssss"})) //可能會導致問題

將提醒:

enter image description here

在改變麻煩製造者到其他東西(例如從\u\1u

將提醒:

enter image description here

現在,讓我們調用函數從我原來的Q,

讓這個alert(JSON.stringify({"a":"sddd\u2028sssss"}))再次嘗試:

結果:

enter image description here

現在,大家都很開心。