我不明白其中的原因。
JSON转义正斜杠,因此哈希{a: "a/b/c"}被序列化为{"a":"a\/b\/c"}而不是{"a":"a/b/c"}。
{a: "a/b/c"}
{"a":"a\/b\/c"}
{"a":"a/b/c"}
为什么?
JSON规范说你可以转义正斜杠,但你不必这么做。
JSON不需要你这样做,它允许你这样做。它还允许您使用"\u0061"A",但它不是必需的,就像Harold L指出的:
哈罗德·L在09年10月16日21:59回答
允许\/有助于在<script>标记中嵌入JSON,它不允许在字符串中嵌入</,就像Seb指出的那样:
\/
<script>
</
这是因为HTML不允许<script>标签中的字符串包含</,所以如果有这个子字符串,你应该转义每个正斜杠。
Seb在09年10月16日22:00回答(#1580667)
微软的一些ASP。NET Ajax/JSON API使用这个漏洞来添加额外的信息,例如,一个datetime将作为"\/Date(milliseconds)\/"发送。(讨厌)
"\/Date(milliseconds)\/"
前段时间我问过同样的问题,不得不自己回答。这是我想到的:
似乎,我的第一个想法[,它来自它的JavaScript 根]是正确的 '\/' === '/'在JavaScript中,和JSON 是有效的JavaScript。然而, 为什么JSON中不允许其他被忽略的转义(如\z) ?< / p > 这里的关键是阅读 http://www.cs.tut.fi/~jkorpela/www/revsol.html,后面跟着 http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2。的特点 斜杠转义允许JSON嵌入到HTML (SGML)和XML中
'\/' === '/'在JavaScript中,和JSON 是有效的JavaScript。然而, 为什么JSON中不允许其他被忽略的转义(如\z) ?< / p > 这里的关键是阅读 http://www.cs.tut.fi/~jkorpela/www/revsol.html,后面跟着 http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.2。的特点 斜杠转义允许JSON嵌入到HTML (SGML)和XML中
'\/' === '/'
\z
PHP默认转义正斜杠,这可能是为什么这种情况出现如此普遍。我怀疑这是因为在<script>标记中嵌入字符串"</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_SLASHES
是的,一些JSON实用程序库这样做是出于各种原因,但主要是遗留的原因。但是他们也应该提供类似setEscapeForwardSlashAlways的方法来关闭这个行为。
在Java中,org.codehaus. jetson . jsonobject提供了一个方法
setEscapeForwardSlashAlways(布尔escapeForwardSlashAlways)
关闭此默认行为。