7

私は現在フロントエンドのTinyMCEからいくつかのhtmlをキャプチャしているコントローラを持っています。もし私が火かき棒をつけているなら、スクリプトタグを提出し、警告メッセージなどを画面に注入することが可能です。ruby​​ on railのフィールドをきれいにする方法

編集:現在、私はサニタイズヘルパーを使用してモデルでこれを固定しています:

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 

を持っている私の/ Libsの下で

はその後、私のモデルでコードが

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

end 

に崩壊これはあまり大騒ぎせず、不要なマークアップを取り除くように思われます。

かなり新しくレールに新しく神経質なことがあるかもしれません。誰もがここに潜在的な欠点を見ることができますか?

おかげで再び

+0

これをレールで処理するもっと一般的な方法は、クライアントから古いクラップスを受け入れて保存することです(安全にSQLインジェクションを避けるよう注意してください)。その後、表示する時間が来たら、そこで浄化してください。 – noodl

+2

それは私には奇妙に思えます。なぜ汚いデータをコミットしたいのですか?それは、私が複数の場所でデータを読み返すと、作業と機密性を失う可能性が増します。 – Chris

+0

@noodlこれにChrisと合意しました。データを前面から取り除くということは、このプロセスを一度行うだけで済むということです。それを取り除くことは、データを表示するたびにこのプロセスが発生しなければならないことを意味します。そして、クリスが言ったように、あなたは視界を守ることを忘れるかもしれません。 – 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 

これにより、内容が変更されたときにいつでも確実に浄化されます。

関連する問題