在我正在处理的应用程序中,客户端 View 是根据数据库中的某些记录生成的。我首先生成记录的 JSON,将其保存在我页面的一个变量中,然后使用 JS 构建界面。
问题是记录包含用户生成的字段,因此应用程序容易受到 XSS 攻击。如果您让 JSON 通过 escape_html
(通过不对其调用 html_safe
),它会搞砸引号。
获取代码。在我的模型中:
Class Foo
# ...
def describe_for_view
[{:title => "hello", :content => "<script>I.Am.Evil()</script>"}]
end
end
在我看来的某个地方:
<script>
var describedForView = $.parseJSON("<%= escape_javascript(@foo.describe_for_view.to_json).html_safe %>");
</script>
然后在我的 javascript 中:
$("body").append("title: " + describedForView[0].title + ", content: " + describedForView[0].content);
我目前正在做的是通过调用 $.sanitize
来包装对用户生成字段的访问,定义如下:
$.sanitize = function(str) {
return $("<div/>").text(str).html();
};
事情是这样运作的,但我认为它不干净。
有什么建议吗?
最佳答案
Rails 3 有一个内置的 SanitizeHelper采用白名单方法。我会在将用户数据保存到数据库之前调用它,或者在您的 escape_javascript 调用中调用它:
escape_javascript(sanitize(some_stuff.to_json))
关于javascript - 在 Rails 的 escape_javascript() 输出中防止 XSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777497/