簡體   English   中英

JSON:為什么要轉義正斜杠?

[英]JSON: why are forward slashes escaped?

這個“逃避”我的原因。

JSON轉義正斜杠,因此 hash {a: "a/b/c"}被序列化為{"a":"a\/b\/c"}而不是{"a":"a/b/c"}

為什么?

["

JSON 規范說您可以轉義正斜杠,但您不必這樣做。

我前段時間問過同樣的問題,不得不自己回答。 這是我想出的:

看來,我的第一個想法 [它來自JavaScript 根源] 是正確的。

'\/' === '/'在 JavaScript 中,JSON有效的 JavaScript。 但是,為什么 JSON 中不允許其他被忽略的轉義符(如\z )?

關鍵是閱讀http://www.cs.tut.fi/~jkorpela/www/revsol.html ,然后是http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2 . 斜線轉義的特性允許將 JSON 嵌入到 HTML(作為 SGML)和 XML 中。

默認情況下,PHP 會轉義正斜杠,這可能就是它如此普遍出現的原因。 我懷疑這是因為在<script>標記中嵌入字符串"</script>"被認為是不安全的。

例子:

<script>
var searchData = <?= json_encode(['searchTerm' => $_GET['search'], ...]) ?>;
// Do something else with the data...
</script>

基於此代碼,攻擊者可以將其附加到頁面的 URL:

?search=</script> <some attack code here>

如果沒有 PHP 的保護,它會生成以下 HTML:

<script>
var searchData = {"searchTerm":"</script> <some attack code here>"};
...
</script>

即使結束腳本標簽在字符串中,它也會導致許多(大多數?)瀏覽器退出腳本標簽並將后面的項目解釋為有效的 HTML。

有了 PHP 的保護,它會變成這樣,不會脫離腳本標簽:

<script>
var searchData = {"searchTerm":"<\/script> <some attack code here>"};
...
</script>

可以通過傳入JSON_UNESCAPED_SLASHES標志來禁用此功能,但大多數開發人員不會使用此功能,因為原始結果已經是有效的 JSON。

丑陋的PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES必須是默認的,而不是一個(奇怪的)選項......如何對 php-developers 說?

默認必須是最常用的,並且(當前)最廣泛使用的標准是 UTF8。 Github 或其他地方有多少 PHP 代碼片段需要這種奇特的“嵌入 HTML”功能?

是的,一些 JSON 實用程序庫出於各種好的但主要是遺留原因而這樣做。 但是他們還應該提供類似 setEscapeForwardSlashAlways 的方法來將此行為設置為 OFF。

在 Java 中,org.codehaus.jettison.json.JSONObject 確實提供了一個名為

setEscapeForwardSlashAlways(布爾值 escapeForwardSlashAlways)

關閉此默認行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM