我不明白其中的原因。
JSON转义了正斜杠,因此哈希{a: "a/b/c"}被序列化为{"a":"a\/b\/c"}而不是{"a":"a/b/c"}。
Why?
我不明白其中的原因。
JSON转义了正斜杠,因此哈希{a: "a/b/c"}被序列化为{"a":"a\/b\/c"}而不是{"a":"a/b/c"}。
Why?
JSON不需要你这样做,它允许你这样做。它还允许你用“\u0061”表示“A”,但这不是必需的,就像Harold L指出的那样:
JSON规范说你可以转义正斜杠,但你不必这么做。
哈罗德·L在09年10月16日21:59回答
允许\/有助于在<script>标记中嵌入JSON,它不允许</字符串,就像Seb指出的那样:
这是因为HTML不允许<script>标签中的字符串包含</,所以如果子字符串在那里,你应该转义每个正斜杠。
Seb在09年10月16日22:00回答(#1580667)
微软的一些ASP。NET Ajax/JSON API使用这个漏洞来添加额外的信息,例如,一个日期时间将被发送为“\/日期(毫秒)\/”。(讨厌)
前段时间我也问过同样的问题,不得不自己回答。这是我想到的:
似乎,我的第一个想法是它来自于JavaScript 根)是正确的。 JavaScript中的'\/' === '/',JSON是有效的JavaScript。然而, 为什么JSON中不允许其他被忽略的转义(比如\z) ? 关键在于阅读 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中。
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实用程序库这样做是出于各种原因,但主要是遗留的原因。但是他们也应该提供类似setEscapeForwardSlashAlways的方法来关闭这个行为。
在Java中,org.codehaus. jetson . jsonobject提供了一个方法
setEscapeForwardSlashAlways(布尔escapeForwardSlashAlways)
关闭此默认行为。