用作 JSON 时,rails 3 转义的 html 标签在浏览器中未转义

Posted

技术标签:

【中文标题】用作 JSON 时,rails 3 转义的 html 标签在浏览器中未转义【英文标题】:rails 3 escaped html tags unescaped in browser when served as JSON 【发布时间】:2017-01-20 11:00:00 【问题描述】:

我有一个 Rails 3.2 应用程序,它使用 ActiveResource 与第三方 XML API 交互以获取某些数据。我们希望确保在该第 3 方 XML 中防止 XSS,因此我们启用了:

ActiveSupport.escape_html_entities_in_json = true 

这似乎适用于 XML 数据,并将潜在危险脚本调用中的 <,如下所示:

<script>alert('xss')</script>

(不知道为什么它只逃避 lt TBH,但它似乎是设计使然)

问题是当我将该 XML 转换为 JSON 并发送到浏览器时,浏览器将其视为未转义。发送到浏览器的 JSON 字符串如下所示:

\u003Cscript\u003Ealert('xss')\u003C/script\u003E"

谁能解释为什么浏览器将其转换回未转义的字符串,并提出解决方法?

FWIW 我正在使用 Backbone、Jquery、JST 和 EJS

【问题讨论】:

【参考方案1】:

如果发送到浏览器的字符串与问题中的字符串一样,则不是浏览器将其转换回来,它已经未经转义发送。但是,我认为服务器不需要对其进行编码,因为它只是数据,以 JSON 的中间数据格式发送。它为 JSON 正确编码的。但是,当您将其插入客户端上的 DOM 时,您必须小心。

在模板中,确保您使用 除非您正在生成某种类型的 javascript 代码,但这可能是一种边缘情况。 p>

您也可以选择按照您最初的要求在响应中对其进行编码,在这种情况下,您应该查看它是如何从 XML 转换为 JSON 的。但请注意,不同的上下文可能需要不同的编码(尤其是写入纯 HTML 与 Javascript 上下文的编码要求非常不同),并且发送数据的服务器可能不(想要)知道客户端想要做什么它。

【讨论】:

以上是关于用作 JSON 时,rails 3 转义的 html 标签在浏览器中未转义的主要内容,如果未能解决你的问题,请参考以下文章

在将 Rails 变量用于 Javascript 时转义引号?

带有从 Rails 生成的 JSON 数据源的 jQuery UI 自动完成 - 不工作

如何在 Rails 中将 Javascript 对象转换为 JSON?

json转义 使用 JavaScriptSerializer 时 需要添加的引用

为啥 Alamofire 4.4.0 将 JSON 字符串转换为转义的 JSON 字符串(Swift 3)?

json_encode中文不转义问题