![](/img/trans.png)
[英]Regular Expression to match pairs of forward slashes, but not escaped or between subsequent http://
[英]JSON: why are forward slashes escaped?
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。
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.