答案 0 :(得分:259)
JSON不要求你这样做,它允许你这样做。它还允许您使用“\ u0061”表示“A”,但这不是必需的。在\/
标记中嵌入JSON时,允许<script>
会有所帮助,因为Seb指出,字符串内部不允许</
。
Microsoft的一些ASP.NET Ajax / JSON API使用此漏洞添加额外信息,例如,日期时间将以"\/Date(milliseconds)\/"
的形式发送。 (呸)
答案 1 :(得分:30)
JSON规范说你可以逃避正斜杠,但你没必要。
答案 2 :(得分:14)
前段时间我问过the same question,我必须自己回答。这就是我想出的:
看来,我首先想到[它来自JavaScript roots ]是正确的。
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。
答案 3 :(得分:7)
Would you like to translate 'Morse Code' to English, or 'English' to Morse code? (Enter 'Morse Code' or 'English'.)
English
Enter a string of English characters (for English, numbers and letters, only):
to be
Invalid data. Enter 'Morse Code' or 'English' without the single quotes.
必须是默认选项,而不是(奇怪)选项... 如何对php开发人员说明?
默认必须是最常用的,而(当前)最广泛使用的标准是UTF8。 Github或其他地方有多少PHP代码片段需要这个exoctic“嵌入HTML”功能?
答案 4 :(得分:4)
PHP escapes forward slashes by default这可能是出现这种情况的原因。我不确定原因,但可能是因为在"</script>"
标记中嵌入字符串<script>
被认为是不安全的。
可以通过传入JSON_UNESCAPED_SLASHES
标志来禁用此功能,但大多数开发人员不会使用此功能,因为原始结果已经是有效的JSON。
答案 5 :(得分:-7)
由于JSON是按照定义javascript,并且在javascript中根据定义,单个反斜杠不能出现在字符串中而不是特殊编码符号(如换行符)的一部分,那么添加额外的符号是完全合乎逻辑的正斜杠的特殊编码符号,因为这简化了防止XSS攻击的任务,所以你甚至可以感谢那个能够将这个(看似)有争议的攻击包含在JSON规范中的天才男人。他们也可以为尖括号添加相同的特殊符号,但似乎没有必要这样做,因为正斜杠中和了它不再具有敌意,他们可以在代码中抛出尽可能多的尖括号 - 它只是不允许任何疯狂的XSS成功。