【问题标题】:Why is my view being flagged as an XSS vulnerability?为什么我的视图被标记为 XSS 漏洞?
【发布时间】:2016-05-29 16:27:28
【问题描述】:

我有一个显示我文章内容的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 记录,对吗?用户还能如何操纵它?

谢谢!

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

【问题讨论】:

    标签: ruby-on-rails security xss brakeman


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!出于好奇,为什么数据库中的值本质上是不受信任的?我希望像 params 这样直接来自用户和表单的输入是不受信任的,但可能更多的是进入数据库的数据已经过验证,现在只是被检索,对吧?
    • @user2490003:原因是数据库可能存储了原始用户输入。一个很好的例子是 Stack Overflow - 数据库中会有 &lt;script&gt; 标签,因为人们将代码发布到网站 - 无法针对恶意输入验证它。 Stack Overflow(以及大多数优秀系统)的方式是在 输出 上进行编码。如果您希望用户输入安全的 HTML,这有点棘手。
    • @SilverlightFox - 非常感谢,这是有道理的。验证恶意代码的 HTML 似乎确实是一个更大的难题。将此答案标记为已接受,但如果有最后一个问题可以回答 - 我在上面的答案(下面?)中详述的方法是否正确?或者这仅仅是一种“愚弄”刹车手的方法,让他们没有检测到我将数据库中的某些东西标记为html_safe 的事实?
    • @user2490003:你这样做并不是在愚弄它。通过以这种方式对其进行编码,您就是在声明“我完全意识到这是原始 HTML,并且我知道我在做什么”,因此制动器知道忽略它。
    • 不,@user2490003 是正确的。该代码“愚弄”了 Brakeman,因为它(当前)不知道 view_context.raw 等同于 raw。如果是这样,它会警告它。 raw 尤其是 html_safe 经常在人们不知道他们在做什么的情况下使用。
    【解决方案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()),因此不会导致视图出现问题。

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

    【讨论】:

      【解决方案3】:

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

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

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

      docs 有很多很好的例子。

      这里是another write-up,如果您想了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-04-17
        • 2023-04-07
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        • 2012-03-10
        • 2012-06-21
        • 2017-01-02
        相关资源
        最近更新 更多