2010-05-21 92 views
4

我正在編寫一個非常簡單的CRUD應用程序,它將用戶素材存儲到數據庫中,以便其他同伴編碼人員可以將它們組織爲我們正在處理的項目。但是,在將用戶輸入保存到數據庫之前,我遇到了一個消毒用戶輸入的問題。我無法從Story模型中調用sanitize()函數去除所有html /腳本。它要求我做到以下幾點:用Ruby on Rails消毒用戶輸入

def sanitize_inputs 
    self.name = ActionController::Base.helpers.sanitize(self.name) unless self.name.nil? 
    self.story = ActionController::Base.helpers.sanitize(self.story) unless self.story.nil? 
end 

我想驗證用戶輸入已經被消毒,而且我不確定的兩件事情: 1)如果用戶輸入驗證發生?在保存數據之前很明顯,我認爲,在我驗證用戶輸入沒有腳本/ html標記之前,我應該在驗證之前,在驗證之前或者在其他一些非明顯區域處理這些東西? 2)爲這個模型編寫單元測試,除了比較「這是惡意代碼示例」和sanitize(example)輸出之外,我將如何驗證腳本/ html是否被刪除?

在此先感謝。

+2

不完全是一個答案,但提醒:rails 3默認清理用戶輸入。 – kikito 2010-05-21 15:19:20

回答

5

有消除XSS漏洞2點的方法:

A.To過濾器在數據庫存儲它(什麼你正在嘗試做的)之前的內容。這裏有2個插件可以爲你做到這一點。

xss_terminate

acts_as_sanitiled

B.To過濾內容時顯示它(Rails 3的默認完成它)。您可以使用h函數或使用rails_xss。我認爲你的單元測試應該只測試消毒方法被調用,而不是功能本身(所以一個簡單的斷言在基本的例子應該做的伎倆)。消毒功能/插件默認已經過很好的測試。

+0

感謝指向acts_as_sanitized和xss_terminate的指針。這也歸結爲,我想我需要使用xss_terminate或滾動我自己的。 – phreakre 2010-05-21 15:25:22

+1

我剛剛發現了xss_terminate在Ruby 1.9中瘋狂出現的難題,並將所有數據庫字符串作爲「[]」返回。如果您使用HTML5libSanitize,另一個問題是它依賴於極其緩慢且不再受支持的Ruby HTML5lib實現。 – simianarmy 2011-09-30 23:40:43

1

我認爲關於消毒輸入的普遍共識是 - 不要。將輸入存儲爲用戶輸入的內容,並在輸出中使用幫助器sanitize。 (例如,<%=h @author.filthy_nasty_data %>

這就是說,你總是可以使用strip_tags助手在this answer提及。

+9

我不同意沒有消除用戶輸入的普遍共識。遵循這個想法,我們不會在驅動器上掃描病毒文件。我認爲在這種情況下深度妥善的防禦是盡力保護投入和產出的衛生。由於這個應用程序不會有任何特殊的標記(沒有bb代碼等),我沒有理由不把任何看起來可疑的任何東西從輸入中剝離出來,並且不會讓數據庫中的邏輯炸彈等待執行。 總有人比你更聰明,你呢? – phreakre 2010-05-21 15:28:06

+1

永遠不要冒用戶輸入的風險。如果你沒有在輸出中捕捉到坐在數據庫中的「邏輯炸彈」,那麼無論如何你都不會在輸入中捕獲它。 – coreyward 2010-11-04 17:20:11

+2

壞人可以插入代碼來利用插入數據庫,所以你必須在插入之前對它進行消毒! – fuzzyalej 2012-02-01 16:00:11