JSON:为什么正斜线逃脱?

这个“逃避”我的原因。

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

为什么?

JSON并不要求你这样做,它允许你这样做。 它也允许你为“A”使用“\ u0061”,但这不是必需的。 在将JSONembedded到<script>标记中时,允许\/ help,这个标记不允许</在string中,像Seb指出的那样。

一些微软的ASP.NET Ajax / JSON API使用这个漏洞来添加额外的信息,例如,date时间将以"\/Date(milliseconds)\/" 。 (呸)

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 。 斜线转义的function允许将JSONembedded到HTML(如SGML)和XML中。

丑陋的PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES必须是默认的,而不是(奇怪的)选项… 如何对php开发者说呢?

默认值必须是最常用的,而(当前)最广泛使用的标准是UTF8。 在Github或其他地方有多lessPHP代码片段需要这种外挂的“embeddedHTML”function?

由于JSON的定义是JavaScript,而且在JavaScript中定义的单个反斜杠不能作为特殊编码符号(如换行符)的一部分存在于string中,那么为正斜杠添加额外的特殊编码符号是完全合乎逻辑的,因为这减轻了XSS攻击的任务,所以你甚至可以感谢那个设法把这个(看似)有争议的黑客入侵到JSON规范中的人。 他们还可以为尖括号添加相同的特殊符号,但似乎没有必要这样做,因为正斜杠被中和,不再有敌意,他们可以在代码中尽可能多地插入尖括号 – 让任何疯狂的屁股XSS成功。