繁体   English   中英

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

[英]Why is my view being flagged as an XSS vulnerability?

我有一个show我的文章内容的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 ),那么/articles/BAD_INPUT Article.find()将找不到该文章并引发错误

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

谢谢!

编辑:当找不到文章并且出现错误时,我肯定会再次保护这个案例,但我认为这更糟糕的是设计而不是安全漏洞

一些挖掘后找到了答案。

它显然与html_saferaw (这只是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() ),因此它不会在视图中引起问题。

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

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

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

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

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

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

文档有很多很好的例子。

如果您想了解更多信息,请参阅另一篇文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM