Rails中escape_javascript()输出中的XSS保护

Protecting from XSS in escape_javascript() output in Rails

本文关键字:输出 保护 XSS escape javascript Rails      更新时间:2023-09-26

在我正在开发的应用程序中,会根据数据库中的一些记录生成客户端视图。我首先生成记录的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))