2013-01-17 67 views
0

我有一個應用程序,收集用戶輸入和存儲到數據庫並顯示回給用戶。欄杆用戶輸入與<script>,存儲,並顯示

一位用戶在名稱字段中輸入「alert(1)」並將其保存到數據庫中。

無論何時顯示名稱,該頁面將被打破。

enter image description here

我知道如何解決這個問題僅輸入驗證輸入,和h()輸出。

但是,我有這麼多的輸入字段和如此多的接受用戶文本的輸出。

是否有任何簡單的方法來防止這種情況的發生(即覆蓋params方法等)?

我也想知道你們的專家們是如何處理這個問題的?

回答

1

從Rails 3開始,我的理解是嵌入的ruby代碼默認是html轉義的。你不需要使用h()來這樣做。也就是說,如果在視圖中使用<%= "<script>a=1/0;</script>" %>,則字符串將變爲html安全,並且腳本不會執行。你將不得不專門使用raw()或類似的東西來避免它 - 除非你對內容充滿信心,否則你自然不應該這樣做。

0

對於輸出,除非我使用raw()方法,否則Rails 3會自動對所有文本進行html編碼。

對於輸入,如何製作一個通用的驗證器並應用於所有文本或字符串的字段?這是可取的嗎?

http://api.rubyonrails.org/classes/ActiveModel/Validator.html

class MyValidator < ActiveModel::Validator 
    def validate(record) 
    record.class.columns.each do |c| 
     if c.type==:text || c.type == :string 
      record.errors.add c.type, "script tag is not allowed" if c[/<script[^>]*>/] 
     end 
    end 
    end 
end