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

时间:2015-10-02 21:48:01

标签: ruby-on-rails ruby xss

我正在试图弄清楚这段代码是否安全。 是否可以攻击此代码?

<script>
  data = <%= data.to_json.html_safe %>;
</script>

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

3 个答案:

答案 0 :(得分:0)

这取决于您使用的数据和您正在使用的Rails版本。如果您使用的是Rails 3以外的任何内容,那么调用html_safe可能会使您的代码容易受到XSS的攻击。<​​/ p>

基本上,您正在做的是告诉应用data.to_json是否安全。但是,应用程序实际上并不确定。

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

答案 1 :(得分:0)

数据中包含“&lt; / script&gt;”的任何字符串在这个例子中,它可以用来轻松实现XSS。

的内容
data = { b: "</script><script>alert('hi')</script>" }

可能会起作用

答案 2 :(得分:-1)

不安全。这是一个简单的攻击:

data = { foo: '</script>bar' }
data.to_json.html_safe

# => "{\"foo\":\"</script>bar\"}"

问题是to_json没有转义/,浏览器会看到</script>标记,并比您预期的更早关闭脚本标记。