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 回答