【问题标题】:Active Record find conditions as stringActive Record 以字符串形式查找条件
【发布时间】:2010-01-18 11:38:51
【问题描述】:

我有一些条件可以传递给查找器。问题是我不想以安全的方式通过。所以想象一下我收到一个哈希:

hash = {:start_date=>'2009-11-01',:end_date=>'2010-01-23'}

我想将它传递给我的查找器,例如:

Model.find(:all,:conditions=>"created > '#{start_date}' and created < '#{end_date}'")

问题在于它是不安全的,而且我遇到了 SQL 注入问题。我的问题是,构成这种情况的最佳方法是什么?

我想动态地做。例如,我今天的做法是:

find_condition = ['created > ? and created < ?','2009-10-01','2010-01-01']
Model.find(:all,:conditions=>find_condition)

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    你可以这样写:

    Model.find(:all,:conditions=>["created > :start_date and created < :end_date", {:start_date => params[:one], :end_date => params[:two]}])
    

    它会被正确转义。

    【讨论】:

      【解决方案2】:

      Active Record 支持使用问号转义条件:

      Model.all(:conditions => ['created > ? and created < ?',
                :start_date, :end_date])
      

      Rails 指南中的一些您可能感兴趣的更多信息:

      【讨论】:

      • @JohnTopley 我认为实际上应该是Model.all(:conditions =&gt; ['created &gt; ? and created &lt; ?', :start_date, :end_date])。 (即条件不也属于[] 吗?)
      • 我相信你的意思是 start_date, end_date 而不是 :start_date, :end_date (冒号)
      • 有趣——这怎么可能?不是吗?只是分别被文本'start_date'和'end_date'替换?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      相关资源
      最近更新 更多