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