2016-02-17 42 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如果你想了解更多的信息。