我有一個應用程序,收集用戶輸入和存儲到數據庫並顯示回給用戶。欄杆用戶輸入與<script>,存儲,並顯示
一位用戶在名稱字段中輸入「alert(1)」並將其保存到數據庫中。
無論何時顯示名稱,該頁面將被打破。
我知道如何解決這個問題僅輸入驗證輸入,和h()輸出。
但是,我有這麼多的輸入字段和如此多的接受用戶文本的輸出。
是否有任何簡單的方法來防止這種情況的發生(即覆蓋params方法等)?
我也想知道你們的專家們是如何處理這個問題的?
我有一個應用程序,收集用戶輸入和存儲到數據庫並顯示回給用戶。欄杆用戶輸入與<script>,存儲,並顯示
一位用戶在名稱字段中輸入「alert(1)」並將其保存到數據庫中。
無論何時顯示名稱,該頁面將被打破。
我知道如何解決這個問題僅輸入驗證輸入,和h()輸出。
但是,我有這麼多的輸入字段和如此多的接受用戶文本的輸出。
是否有任何簡單的方法來防止這種情況的發生(即覆蓋params方法等)?
我也想知道你們的專家們是如何處理這個問題的?
從Rails 3開始,我的理解是嵌入的ruby代碼默認是html轉義的。你不需要使用h()
來這樣做。也就是說,如果在視圖中使用<%= "<script>a=1/0;</script>" %>
,則字符串將變爲html安全,並且腳本不會執行。你將不得不專門使用raw()
或類似的東西來避免它 - 除非你對內容充滿信心,否則你自然不應該這樣做。
對於輸出,除非我使用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