JSON:为什么正斜线逃脱了?

时间:2009-10-16 21:54:19

标签: javascript json

这个“逃脱”我的原因。

JSON转义正斜杠,因此哈希{a: "a/b/c"}被序列化为{"a":"a\/b\/c"}而不是{"a":"a/b/c"}

为什么?

6 个答案:

答案 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)

丑陋的PHP!

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成功。