【问题标题】:JSON: why are forward slashes escaped?JSON:为什么正斜杠转义?
【发布时间】:2010-12-07 12:41:48
【问题描述】:

这个“逃脱”我的原因。

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

为什么?

【问题讨论】:

  • FWIW 我从未见过 JSON 中的正斜杠转义,我只是在 code.google.com/p/json-simple 的 Java 库中注意到它
  • PHP 的 json_encode() 默认转义正斜杠,但从 PHP 5.4.0(2012 年 3 月)开始具有 JSON_UNESCAPED_SLASHES 选项
  • 这是一个不会转义每一个斜线的PHP代码,只在'</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
  • 代码是否包含 '': 还是从 echo 开始?因为从 echo 开始对我来说失败了。我根本什么都没有。是的,我用我的变量替换了我的 $obj :)
  • JSON 不会转义或序列化任何东西......您的 JSON 序列化程序会。你用的是哪一个?

标签: javascript json


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

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

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

【讨论】:

  • 您可以添加指向该特定部分的链接吗?
  • @JoaEbert :必须转义反向固相线,但您不需要转义固相线。第 9 节说“除了必须转义的字符外,所有字符都可以放在引号内:引号 (U+0022)、反斜线 (U+005C) 和控制字符 U+0000 到 U+001F。 "
  • 谢谢哈罗德!您是对的,如图 5 所示,因为“除 ... 之外的任何代码点”清楚地表明 / 是可选的。
【解决方案3】:

我前段时间问过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。

【讨论】:

  • 结构化数据有效负载传递机制不应与语言结构相关联......因为这可能会在未来发生变化......但如果有任何 JSON 创建者,这可能会解释设计决策。
  • '\/' === '/' 所以我在收到我的 jsonp 时不需要转义正斜杠?
【解决方案4】:

PHP escapes forward slashes by default 这可能就是它如此普遍出现的原因。我不确定为什么,但可能是因为将字符串 "</script>" 嵌入到 <script> 标记中被认为是不安全的。

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

【讨论】:

  • "被认为是不安全的" -> 确实不安全。漏洞利用:<script>let the = "bodies </script><script>alert("the floor");</script>";</script> 试试看,身体会提醒地板,而不是获取一个名为“the”的变量,其值中有脚本标签。您可以说“然后不要将其嵌入到页面中”,是的,这是一种可能的解决方法,但是无论如何很多人都会这样做(所以让我们制作好的转义函数,因为为什么不这样做)坦率地说,我理解他们的观点:它如果 JSON 数据在 JavaScript 中具有正确转义的数据值是安全的,那将是有意义的。
  • 感谢@Luc - 为什么 PHP 选择默认转义斜杠的一个很好的例子!默认情况下,函数应该是安全的,只有在您特别需要时才不安全。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
相关资源
最近更新 更多