data.to_json.html_safe容易受到XSS攻击吗?

Gil*_*man 5 ruby xss ruby-on-rails ruby-on-rails-4

我想弄清楚这段代码是否安全。是否有可能攻击这段代码?

<script>
  data = <%= data.to_json.html_safe %>;
</script>
Run Code Online (Sandbox Code Playgroud)

换句话说,什么值data会导致成功的攻击?

Kor*_*ght -1

这在某种程度上取决于您对数据的处理方式以及您使用的 Rails 版本。如果您使用的是 Rails 3 之后的任何版本,那么不行,调用html_safe可能会使您的代码容易受到 XSS 攻击。

基本上,您所做的就是告诉应用程序data.to_jsonhtml 是安全的。然而,应用程序实际上并不确定这一点。

它的作用html_safe是将字符串标记为安全的,可以直接插入 HTML,而不会转义字符串中的任何内容。正如方法 api 中所述,它不应​​该用于用户输入。构造的输入可能是安全的,但要由您来确保它是安全的。

to_json将给定字符串转换为 JSON。默认情况下,它不会转义 HTML 字符,例如<, / >

因此,如果data是用户输入,那么某人完全有可能将自己的脚本插入其中,并按照当前编写的方式将其标记为安全(从而呈现为 html)。

按照这种写法,如果有人执行以下操作:

data = "</script><script>insert_xss_attack_here</script>"

您的代码不会转义脚本,从而导致脚本被代码执行。

许多人描述了 html_safe 和 to_json 的问题:

这专门涉及 to_json.html_safe http://jfire.io/blog/2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/

https://bibwild.wordpress.com/2013/12/19/you-never-want-to-call-html_safe-in-a-rails-template/

http://makandracards.com/makandra/2579-everything-you-know-about-html_safe-is-wrong