我正在试图弄清楚这段代码是否安全。 是否可以攻击此代码?
<script>
data = <%= data.to_json.html_safe %>;
</script>
换句话说,data
的哪个值会导致攻击成功?
答案 0 :(得分:0)
这取决于您使用的数据和您正在使用的Rails版本。如果您使用的是Rails 3以外的任何内容,那么调用html_safe
可能会使您的代码容易受到XSS的攻击。</ p>
基本上,您正在做的是告诉应用data.to_json
是否安全。但是,应用程序实际上并不确定。
html_safe
的作用是将字符串标记为可以直接插入HTML而不转义字符串中的任何内容。如方法api中所述,它永远不应该用在用户输入上。构造的输入可能是安全的,但是由您来确保它是。
to_json
将给定的字符串转换为JSON。默认情况下,它不会转义像<, / >
因此,如果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>
标记,并比您预期的更早关闭脚本标记。