rails 3 个转义 html 标记在浏览器中作为 JSON 未转义
rails 3 escaped html tags unescaped in browser when served as JSON
我有一个 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
如果发送到浏览器的字符串与问题中的字符串一样,那么不是浏览器将其转换回来,而是已经未转义地发送了。但是,我认为服务器不需要对其进行编码,因为它只是数据,以 JSON 的中间数据格式发送。它 是 为 JSON 正确编码的。不过,将其插入客户端的 DOM 时必须小心。
在模板中,确保使用 <%- 而不是 <%= 并且它应该没问题除非你正在生成 javascript 某种代码,但这可能是一个边缘案例。
您也可以选择按照最初的要求在响应中对其进行编码,在这种情况下,您应该查看它是如何从 XML 转换为 JSON 的。但请注意,不同的上下文可能需要不同的编码(特别是写入普通 HTML 与 Javascript 上下文的编码要求非常不同),并且发送数据的服务器可能不会(想要)知道客户想用它做什么。
我有一个 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
如果发送到浏览器的字符串与问题中的字符串一样,那么不是浏览器将其转换回来,而是已经未转义地发送了。但是,我认为服务器不需要对其进行编码,因为它只是数据,以 JSON 的中间数据格式发送。它 是 为 JSON 正确编码的。不过,将其插入客户端的 DOM 时必须小心。
在模板中,确保使用 <%- 而不是 <%= 并且它应该没问题除非你正在生成 javascript 某种代码,但这可能是一个边缘案例。
您也可以选择按照最初的要求在响应中对其进行编码,在这种情况下,您应该查看它是如何从 XML 转换为 JSON 的。但请注意,不同的上下文可能需要不同的编码(特别是写入普通 HTML 与 Javascript 上下文的编码要求非常不同),并且发送数据的服务器可能不会(想要)知道客户想用它做什么。