3

Rails モデルで、start_date と end_date でフィルタリングする named_scope を達成しようとしています。かんたんだよ。しかし、私は多くの異なる分野で多くの機会にそれをしなければなりません.

これはトラブルを求めていますか?もしそうなら、なぜ(SQLインジェクション?)これを達成する別の方法がありますか。

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

編集:使用されるソリューション

私が行った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 インジェクションを回避したりできます。今後のインプット。

4

1 に答える 1

4

おそらく、「フィールド」を検証するためにモデルにメソッドを書くことができます:

テーブル x の場合、「フィールド」はそのテーブル内の特定の既存の日付フィールドでなければなりません。

つまり、「フィールド」への外部入力を直接許可しないでください。外部入力は、検証メソッドで指定された既知の属性と定義済みの条件にマップする必要があります。

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

于 2009-05-26T05:12:43.943 に答える