JSON:为什么要转义正斜杠?

IT技术 javascript json
2021-02-01 09:06:03

这个“逃脱”我的原因。

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

为什么?

4个回答

JSON 不要求您这样做,它允许您这样做。它还允许您将 "\u0061" 用于 "A",但这不是必需的,就像 Harold L 指出的那样:

JSON 规范说您可以转义正斜杠,但您不必这样做。

Harold L 于 09 年 10 月 16 日 21:59 回答

\/<script>标签中嵌入 JSON 时允许有帮助,这不允许</在字符串中,就像 Seb 指出的那样:

这是因为 HTML 不允许<script>标签内的字符串包含</,所以如果子字符串在那里,您应该转义每个正斜杠。

Seb 于 09 年 10 月 16 日 22:00 回答 (#1580667)

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

有关 ASP.NET JSON 日期格式的基本原理,请参阅此博客文章:weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
2021-03-21 09:06:03
@DanRoss 它可以。转义/不是必需的,而是允许的,以简化 JSON 的使用。不想逃/,就别
2021-03-21 09:06:03
这将是一件好事,逃脱只是 </。尽管 JSON 通常并不经常嵌入到脚本标签中。
2021-03-28 09:06:03
JSON 需要被替换,因为 JSON 序列化程序的特定实现会输出一些 JSON(虽然是完全有效的 JSON)有一些额外的字符,所以它也可以作为 JS 文字放入 HTML 脚本元素中?!与其说是把婴儿和洗澡水一起倒掉,不如说是因为有人给他买了一套水翼而把婴儿扔出去。
2021-04-03 09:06:03
我不明白的是,为什么 JSON 序列化程序甚至会关心 JSON 的最终位置。在网页上,在 HTTP 请求中,无论如何。如果需要,让最终渲染器进行额外编码。
2021-04-05 09:06:03

JSON 规范说您可以转义正斜杠,但您不必这样做。

您可以添加指向该特定部分的链接吗?
2021-03-18 09:06:03
@JoaEbert:必须转义反向立体线,但您不需要转义立体线。第 9 节说“除了必须转义的字符外,所有字符都可以放在引号内:引号 (U+0022)、反斜线 (U+005C) 和控制字符 U+0000 到 U+001F。 ”
2021-03-29 09:06:03
谢谢哈罗德!您是对的,也如图 5 所示,因为“除 ... 之外的任何代码点”明确指出 / 是可选的。
2021-04-01 09:06:03

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

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

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

关键是阅读 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 创建者,这可能解释设计决策。
2021-03-19 09:06:03
'\/' === '/' 所以我在接收 jsonp 时不需要转义正斜杠?
2021-04-04 09:06:03

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

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

被认为是不安全的”->它确实是不安全的。漏洞利用:<script>let the = "bodies </script><script>alert("the floor");</script>";</script>尝试一下,body 会向地板发出警报,而不是获取一个名为“the”的变量,其值中带有脚本标签。您可以说“然后不要将其嵌入页面”,是的,这是一种可能的解决方法,但无论如何很多人都会这样做(所以让我们制作好的转义函数,因为为什么不这样做)并且坦率地说我理解他们的观点:它如果在 JavaScript 中使用正确转义数据值的 JSON 数据是安全的,那将是有意义的。
2021-03-26 09:06:03
谢谢@Luc - 一个很好的例子,说明了为什么 PHP 选择默认转义斜杠!默认情况下,函数应该是安全的,并且只有在您特别想要它时才不安全。
2021-04-03 09:06:03