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

Jas*_*n S 354 javascript json

这个"逃脱"我的原因.

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

为什么?

Rub*_*ben 271

JSON不要求你这样做,它允许你这样做.它还允许您使用"\ u0061"表示"A",但这不是必需的.\/<script>标记中嵌入JSON时允许帮助,这不允许</内部字符串,如Seb所指出的.

一些Microsoft的ASP.NET Ajax/JSON API使用这个漏洞来添加额外的信息,例如,日期时间将被发送为"\/Date(milliseconds)\/".(呸)

  • 需要更换JSON,因为JSON序列化程序的特定实现输出一些JSON(**是完全有效的JSON**)有一些额外的字符,所以它也可以作为JS文字放入HTML脚本元素?!这并不是因为有人给他买了一套水翼,而是把婴儿扔出洗澡水. (22认同)
  • 我没有得到的,是为什么JSON序列化器甚至会关心JSON最终的位置.在网页上,在HTTP请求中,无论如何.如果需要,让最终渲染器执行其他编码. (11认同)
  • 有关ASP.NET JSON日期格式的基本原理,请参阅此博客文章:http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx (8认同)
  • @DanRoss它可以.转义`/`不是*必需*,*允许*,以便于使用JSON.如果你不想逃避`/`,那就不要了. (5认同)
  • 这将是一件好事,只是逃避</.虽然JSON通常不会嵌入脚本标签中. (4认同)
  • ...在编码机制中唯一需要转义的字符是编码机制结构本身中使用的特殊字符(对于 JSON 来说是 ", {,},[,] 等)...所有其他字符是有效负载,应该这样对待......如果你因为发送了错误的字符而破坏了html,那么“结构化数据的编码机制没有责任解决这个问题......JSON需要被替换......它”应该与客户端语言、服务器端语言和应用程序无关,它是一种有效负载传递机制。 (2认同)
  • @TJCrowder HTML 3.2 和 4.01 规范明确禁止在 `&lt;script&gt;`(和 `&lt;style&gt;`)中使用 `&lt;/`。因为,浏览器应该如何对待`&lt;div&gt;&lt;script&gt;["&lt;/div&gt;"]&lt;/script&gt;`?您可以(应该?)将其解释为 `&lt;div&gt;&lt;script&gt;["&lt;/script&gt;&lt;/div&gt;&lt;script&gt;"]&lt;/script&gt;`。因为如果你将 `&lt;script&gt;` 更改为 `&lt;b&gt;`,这就是它应该被解析的方式。只有 HTML 5 规范将其更改为 `&lt;/script`。在过去,我们甚至使用 `&lt;script&gt;&lt;!-- ... //--&gt;&lt;/script&gt;`(和其他魔法咒语)只是为了绝对确保脚本标签的内容不会被误解. (2认同)

Har*_*d L 32

JSON规范说你可以逃脱正斜杠,但你不必这样做.

  • @JoaEbert:必须逃避反向固定,但你不需要逃避固定.第9节说"除了必须转义的字符外,所有字符都可以放在引号内:引号(U + 0022),反向固相(U + 005C)和控制字符U + 0000到U + 001F. " (9认同)
  • 您可以添加指向该特定部分的链接吗? (7认同)
  • 谢谢哈罗德!你也是对的,如图5所示,"除了......之外的任何代码点"都明确指出/是可选的. (3认同)

Bol*_*wyn 15

我前一段时间问了同样的问题,不得不自己回答.这是我想出的:

看来,我的第一个想法[ 它来自它的JavaScript根源 ]是正确的.

'\/' === '/'在JavaScript中,JSON 有效的JavaScript.但是,为什么\z在JSON中不允许其他被忽略的转义(例如)?

关键是阅读 http://www.cs.tut.fi/~jkorpela/www/revsol.html,然后是 http://www.w3.org/TR/html4/appendix/notes.html#hB .3.2.斜杠转义的功能允许将JSON嵌入HTML(作为SGML)和XML中.

  • 结构化数据有效负载传递机制不应该与语言结构相关联......这可能会在将来发生变化......但如果有任何JSON创建者,这可能会解释设计决策. (5认同)
  • '\/' === '/' 所以我在接收 jsonp 时不需要转义正斜杠? (2认同)

Sim*_*ast 6

PHP默认情况下转义正斜杠,这可能是为什么它如此常见的原因。我不知道为什么,但可能是因为嵌入字符串"</script>"一个内部<script>标签被认为是不安全的。

可以通过传递JSON_UNESCAPED_SLASHES标志来禁用此功能,但是由于原始结果已经是有效的JSON,因此大多数开发人员将不会使用此功能。

  • “*被认为是不安全的*” -&gt; 它确实不安全。利用:`&lt;script&gt;让=“身体&lt;/ script&gt; &lt;script&gt;警报(“地板”); &lt;/ script&gt;“; &lt;/ script&gt;`尝试一下,身体会警告地板而不是得到一个名为“the”的变量,其值中带有脚本标记。你可以说“那就不要将它嵌入到页面中”,是的,这是一个可能的解决方法,但很多人无论如何都会这样做(所以让我们制作良好的转义函数,因为为什么不呢)坦率地说,我理解他们的观点:如果 JSON 数据在 JavaScript 中具有正确转义的数据值是安全的,那就有意义了。 (4认同)
  • 谢谢@Luc - 为什么 PHP 默认选择转义斜杠的一个很好的例子!默认情况下,函数应该是安全的,只有当您特别希望这样时才不安全。 (2认同)

Pet*_*uss 5

丑陋的PHP!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES必须是默认的,而不是一个(奇怪)选项... 怎么说给PHP开发人员?

默认情况下一定是最频繁使用,以及(电流)应用最广泛的标准UTF8.Github或其他地方有多少PHP代码片段需要这种exoctic"嵌入HTML"功能?

  • 这不是抱怨任何特定语言的地方。指出 PHP_currently_ 的作用以及如何禁用它会更有帮助,并且[现已添加执行此操作的答案](/sf/answers/3386175061/)。 (4认同)
  • 你完全错了。这是由于 JavaScript。正如下面所指出的。在 JS 中 `'\/' === '/'` 返回 true。我建议你坚持事实。大多数人能够处理一些不一致的函数名称。仅仅因为你看不到过去,并不意味着 PHP 是一个糟糕的工具。 (3认同)
  • 对了!然而,PHP会在未来推广所有奇怪的错误,不会破坏所有那些在全球范围内像虫子一样传播的破坏性历史PHP片段中常见的错误.因此,PHP所做的所有错误决定,即几乎所有关于PHP的决定,都成为标准.您无法期望标准可以更改,因此每个PHP开发人员都必须知道并实现所有这些针对PHP中发现的所有严重错误的变通方法.输入stackoverflow .. (2认同)