2016-05-12 5 views
0

ユーザが入力したデータに対しては、htmlや悪意のあるもの(タグ)を取り除くために保存する前に、サニタイズする方法をとっています。ユーザ入力をサニタイズするRails

私はbefore_validationコールバックを持っている:

before_validation :sanitize_fields 

def sanitize_fields 
    full_sanitizer = Rails::Html::FullSanitizer.new 
    white_list = Rails::Html::WhiteListSanitizer.new 

    # Only text allowed 
    self.fname = full_sanitizer.sanitize(self.fname) 
    self.lname = full_sanitizer.sanitize(self.lname) 
    self.company = full_sanitizer.sanitize(self.company) 

    # Some HTML Allowed 
    self.description = white_list.sanitize(self.description) 
end 

私が遭遇しています問題は、名前として「スミス&会社」のようなものを保存するときに、それがSmith & Companyとして、DBに格納されていることです。それ自体は問題ではありませんが、フォームの編集ビューにはSmith & Companyと表示されますが、これはエンドユーザーにとって面白く混乱しているようです。

私が取っているアプローチよりも良い方法がありますか?これは私に間違っている "におい"。

ありがとうございます!

+0

タグを取り除くことを心配するべきではありません。ユーザーがフィールドに「 sure」と入力すると、タグ – meagar

+0

としてレンダリングされたタグが表示されることを期待しています。このようにsmthで作業していて、MarkDownで終わりました。ずっとクーラーとクリーナー。 – 7urkm3n

答えて

2

データが消毒されていると確信が持てる場合は、&と表示されないようにビューでhtml_safeと宣言できます。提供されているとおりに正確にレンダリングされます。

これは当然のことながら、フープを飛ばして事前浄化し、それが浄化されていると伝えるのではなく、デフォルトでそうしたように鑑賞することができます。ビュー内で文字列"<tag>some_stuff</tag>"をレンダリングすると、エスケープされます。管理しているビュー以外の場所に表示されている非暗号化された文字列について心配していますか?

+0

あなたの返事をありがとう。私は私の前殺虫剤を取り除くべきだと私は同意する。しかし、どうすれば 'いくつか& stuff'を ' some&stuff'とするとどうでしょうか?私は '&'が '&'として格納されるインスタンスを持っています。 – cman77

+0

'CGI.unescapeHTML'でラップできますか? – cman77

+0

まさに私が提案しようとしていたことは、あなたは私にそれを打つことでした。既存のデータをエスケープしてdbに保存するために、バックフィルスクリプトをオフラインで実行することは実際的ではないでしょうか?それが私の好みのアプローチです。それで、それが浄化されているかどうかを知ることについて心配する必要はありません。それ以外の場合は、実際にエスケープしたいかどうかを判断するために、厄介な 'if'ステートメントを切り替えなければなりません。 –

1

これは間違ったにおいがする理由です。

大きなテキスト(マークダウンなど)ブロックをhtmlにpeレンダリングすることを除いて、この方法でモデルデータを消毒することは避けます。レールのベストプラクティスはSQLインジェクションからあなたを守ります。ビューのテキスト出力はデフォルトで安全にレンダリングされます。

ユーザーがhtmlを入力できるようにする必要がある場合は、入力時ではなく出力(ビュー内)で消してください。

懸念の分離が1つの理由ですが、最大のことは、あなたがしようとしていることは単なる慣用​​的なものではないということです。あなたがその道を続行することを選択した場合、あなたは常にフレームワークと戦います。

関連する問題