2009-05-26 7 views
3

Railsモデルでは、start_dateとend_dateをフィルタリングするnamed_scopeを適用しようとしています。かんたんだよ。しかし、私は多くの場面でたくさんの異なる分野でそれをやらなければなりません。named_scopeの変数フィールド名?

これは問題を尋ねていますか?もしそうなら、なぜ(SQLインジェクション?)これを達成する別の方法があります。

named_scope :between, lambda {|start_date, end_date, field| 
    { :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date] } 
} 

EDIT:思考のEggdropののラインを使用して

を使用する溶液私は一緒に行きました:

@@valid_fields = %w(fields in here) 

named_scope :between, lambda{ |start_date, end_date, field_name| 
    field = (@@valid_fields.include?(field_name)) ? (field_name) : raise (ActiveRecord::StatementInvalid) 
    { :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date]} 
} 

今、私は基本的に書き換えることなく、私は日付範囲でフィルタするフィールドのための私のnamed_scopeを再利用することができます同じスコープを何度も繰り返し、フィールド名をホワイトリストに入れて、カラム名やトリックなSQLインジェクションを回避してください。テーブルxが、その後、「フィールド」は、そのテーブル内の特定の既存の日付フィールドでなければならない場合

答えて

4

たぶん、あなたは「フィールド」を検証するために、あなたのモデルにメソッドを書くことができます。

つまり、外部入力を直接「フィールド」に入力することはできません。外部入力は、validateメソッドで指定された既知の属性と定義済みの条件にマップする必要があります。

一般的に、この全体的な方向は推奨されないようです。

+0

現在フィールドホワイトリストを使用しており、フィールドがこれに含まれていない場合は例外が発生します。 – nitecoder

+0

はい、私たちは同じことを話していると思います。 – eggdrop

+0

クール、それは他の誰かが私にも提案したことです。今は最高の道のようだ。ありがとう:) – nitecoder

関連する問題