为什么我的观点被标记为XSS漏洞?

时间:2016-02-17 19:14:13

标签: ruby-on-rails security xss brakeman

我有一条显示文章内容的show路线

控制器:

def show
  @article = Article.find(params[:id])
end

查看:

...
<li class="content"><%= @article.content.html_safe %></li>
...

运行Brakeman时,它会将上述内容标记为潜在的跨站点脚本(XSS)漏洞

Unescaped model attribute near line 34: Article.find(params[:article_id]).content

我试图找出XSS到底是什么以及是什么让这个变得脆弱?如果有人将某些恶意文本或输入注入路线中的params[:id]字段(例如/articles/BAD_INPUT),则Article.find()将找不到该文章并引发错误

视图呈现的唯一方法是找到有效的Article记录,对吧?用户还能如何操纵它?

谢谢!

编辑:当找不到文章并且出现错误时,我绝对应该再次保护,但我认为这更糟糕的是设计而不是安全漏洞< / p>

3 个答案:

答案 0 :(得分:2)

在挖掘之后找到了答案。

这显然与html_saferaw(这只是html_safe的别名)有关。该问题仅针对Brakeman并概述了here

该主题表示该问题得到了承认和解决,但使用最新版本仍然无效。

我解决了它如下

<强>控制器:

def show
  @article = Article.find(params[:id])
  @article_content = view_context.raw(@article.content)
end

查看:

...
<li class="content"><%= @article_content %></li>
...

基本上我们事先将文章内容标记为html_safe(使用别名raw()),因此它不会在视图中引起问题。

梅西耶比我想要,但它的确有效

答案 1 :(得分:2)

Brakeman警告,因为代码从数据库获取信息并在视图中输出而不转义它。默认情况下,Brakeman将数据库中的值视为具有潜在危险。在这种情况下,您可能知道文章内容是HTML,并且可以安全地输出而不会转义它。如果您不希望使用数据库中的值来警告XSS,可以使用--ignore-model-output选项。

(你在答案中链接的问题并不是真正相关的。预计Brakeman会警告raw / html_safe使用具有潜在危险价值的内容。)

答案 2 :(得分:1)

如果您在模型上存储html并且使用的是Rails 4.2 ++,则可以考虑使用sanitize帮助程序(docs)。

例如,您可以允许特定代码(例如链接):

<%= sanitize @article.content, tags: %w(a), attributes: %w(href) %>

docs有很多很好的例子。

如果您想了解更多信息,请点击another write-up