3

我有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是找到有效记录,对吗?用户还能如何操纵它?

谢谢!

编辑:我绝对应该防止找不到文章并引发错误的情况,但我认为这更像是一个糟糕的设计而不是安全漏洞

4

3 回答 3

3

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

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

于 2016-02-18T02:05:39.293 回答
2

好的,经过一番挖掘,找到了答案。

它显然与html_safeand raw(这只是 的别名html_safe)有关。该问题特定于 Brakeman,并在此处概述

该线程表示该问题已得到确认并已解决,但使用最新版本仍然对我不起作用。

我解决了如下

控制器:

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

看法:

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

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

比我想要的更混乱,但它有效

于 2016-02-17T20:19:27.507 回答
1

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

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

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

文档有很多很好的例子。

如果您想了解更多信息,这里是另一篇文章。

于 2016-11-15T16:56:19.710 回答