2016-02-17 44 views
2

我有一个显示我的文章的内容show路线为什么我的视图被标记为XSS漏洞?

控制器:

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

查看:

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

当运行司闸员,它的标志上面的潜在的跨站点脚本(XSS)漏洞

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

我想弄清楚XSS究竟是什么,是什么让这种脆弱?如果有人注入了一些恶意的文本或输入到params[:id]领域的途径(例如/articles/BAD_INPUT),那么Article.find()不会发现的文章,并引发错误

视图渲染是,如果一个有效的Article记录被发现的唯一办法,右?用户还可以如何操纵它?

谢谢!

编辑:我一定要agains的情况下保护时没有找到的文章,将引发一个错误,但我想这是更坏的设计,而不是一个安全漏洞

回答

2

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

(您在答案中链接的问题并没有真正相关。司闸员预计警告潜在的危险值raw/html_safe用途。)

+0

谢谢!出于好奇,为什么数据库的值本身不受信任?我希望像'params'这样直接来自用户和表单的输入是不可信的,但是大概这些输入数据的数据经过了验证,现在只是被检索出来,对吧? – user2490003

+1

@ user2490003:原因是因为数据库可能存储原始用户输入。 Stack Overflow就是一个很好的例子 - 数据库中会有'

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() ),所以它不会导致问题e视图。

梅西耶比我想的,但它的工作原理

1

如果你在你的模型存储的HTML和你on Rails的4.2 ++,你可以考虑使用sanitize助手(docs)。

例如,可以允许特定的标签(例如链接):

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

docs有很多很好的例子。

这里的another write-up如果你想了解更多的信息。