我想根据用户输入筛选我的paginate
返回值。但是用户输入并不总是精确的。因此,我必须使用like
,而不是使用=
比较。我的第一次尝试是
Person.paginate :page => params[:page], :conditions => ["name like '%?%'", entered_name]
但是得到的查询是CCD_ 4。这是一个无效的查询。
下面的查询返回了我试图实现的目标,但它打开了SQL注入的漏洞。
Person.paginate :page => params[:page], :conditions => ["name like '%#{entered_name}%'"]
其结果查询为where name like '%my_user_input%'
。
问题是:如何在不产生此安全问题的情况下使用类似条件?
我用的是3.0.20的铁轨。
ActiveRecord支持Arel::Table
上处理转义的matches
方法。
在您的情况下,您可以使用
Person.where(Person.arel_table[:name].matches("%#{params[:entered_name]}%")).
paginate(page: params[:page])
并将安全处理留给ActiveRecord。