首页 > 解决方案 > Rails的api模式下如何防止XSS攻击?

问题描述

我读过一篇关于防止 XSS 攻击的文章。它解释说,Rails 本身可以防止一些攻击。实际上 Rails 使用ERB::Util#html_escape函数来转义 HTML 实体。

<b>Hello <%= params[:name] %></b>
如果上面被 攻击?name=<script>alert(1)</script>,输出将如下:
<b> Hello &lt;script&gt;alert(1)&lt;/script&gt;gt; </b>

但是,当我name在 API 模式下传递它时,它不起作用。

邮差
url?name=<script>alert(1)</script>

Rails App
params[:name]
的输出将是"<script>alert(1)</script>".

它是否有任何配置可以在 API 模式下正常工作?

标签: ruby-on-railsruby-on-rails-5

解决方案


接收这样的数据不是攻击。显示它是一种攻击。

默认情况下,Rails 在 HTML 上下文中转义,并且只在 HTML 上下文中,所以当你这样做时:

<p><%= params[:name] %></p>

您会看到转义版本变得无害。解决这个问题的唯一方法是,如果你特意用 声明它是安全的html_safe,除非你确定它是安全的,否则你不会这样做。

如果您有一个完全没有前端的 API 风格的应用程序,那么恭喜您,您可以免受 XSS 攻击。但是,您的客户需要采取预防措施,以确保他们正确地转义任何内容以适应其呈现的适当上下文。

换句话说,除非显示 HTML,否则 Rails 不会也不应该关心。

请记住,参数本身永远不会改变,它只是在显示之前转义。


推荐阅读