我有一条显示文章内容的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>
答案 0 :(得分:2)
在挖掘之后找到了答案。
这显然与html_safe
和raw
(这只是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。