7

我目前有一個控制器從前端的TinyMCE捕獲一些HTML。如果我用螢火蟲修補,可以提交腳本標記並將警報消息插入到屏幕上。如何最好的消毒軌道上的紅寶石字段

編輯:目前,我在模型中使用了sanitize幫助解決這個:

require 'action_view' 

class NotesController < AuthApplicationController 

    include ActionView::Helpers::SanitizeHelper 
... 
    def update 
    params[:note][:content] = sanitize(params[:note][:content], 
     :tags => %w(a object p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 

    @note.update_attributes(params[:note]) 

這種感覺在控制器中凌亂。有沒有更好的辦法?即以某種方式整合了這個ActiveRecord,所以我可以很容易地指定在對這個和其他字段執行此操作之前,以類似的方式進行驗證?

感謝您的任何建議。

編輯:

在這裏取得了一些進展。

在我的/利布斯我有

module SanitizeUtilities 
    def sanitize_tiny_mce(field) 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 
end 

然後在我的模型代碼摺疊到

class MyModel < ActiveRecord::Base 
    include ::SanitizeUtilities 
... 
    before_save :sanitize_content 
... 
    def sanitize_content 
    self.content = sanitize_tiny_mce(self.content) 
    end 

end 

這似乎是掉不想要的標記沒有太過計較。

對軌道很新,很緊張我可能會做錯事。任何人都可以在這裏看到潛在的缺點嗎?

再次感謝

+0

在rails中處理這個問題的更常用的方法是接受來自客戶端的任何垃圾並保存(安全,小心避免SQL注入)。然後在需要展示的時候進行清理。 – noodl

+2

對我來說這似乎很奇怪,爲什麼我會提交髒數據?如果我將數據讀回到多個地方,這會增加錯過清理工作的機會和機會。 – Chris

+0

@noodl同意克里斯在這一個。預先清除數據意味着你只需要進行一次這個過程。不刪除意味着每次顯示數據時都必須執行此過程。就像克里斯說的那樣,你可能忘記保護觀點。 – iwasrobbed

回答

11

我認爲你正在做的方式是好的,但如果你正在使用before_save,那麼你可能仍然無法驗證(因爲before_save被驗證之後調用)。另外,你不一定要把它放到它自己的模塊中,它可能只是你班上的私人方法。

喜歡的東西:

class MyModel < ActiveRecord::Base 

    before_validation :sanitize_content, :on => :create 

    private 
    def sanitize_content 
     self.content = sanitize_tiny_mce(self.content) 
    end 
    def sanitize_tiny_mce(field) 
     ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 

end 
+0

大概是'on:[:create,:update]'也是......其他任何最佳實踐? – Meekohi

1

這個問題似乎回答,但任何人來此,你可能要考慮使用自定義存取器,使這個更加透明。例如:

class MyModel < ActiveRecord::Base 
    def content= content 
    write_attribute(:content, sanitize_tiny_mce(content) 
    end 

    private 

    def sanitize_tiny_mce content 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data) 
    ); 
    end 
end 

這將確保內容在任何時候被改變時被消毒。