如果使用ActiveRecord无法高效地表示查询,那么在插入传递params
属性时如何安全使用ActiveRecord::Base.connection.execute
?避免使用connection.execute进行sql注入
connection.execute "... #{params[:search]} ..."
如果使用ActiveRecord无法高效地表示查询,那么在插入传递params
属性时如何安全使用ActiveRecord::Base.connection.execute
?避免使用connection.execute进行sql注入
connection.execute "... #{params[:search]} ..."
您可以使用ActiveRecord::Sanitization::ClassMethods中的方法。
您必须小心谨慎,因为它们受到保护,因此仅适用于ActiveRecord::Base
子类。
在你可以做类似的模型类:
class MyModel < ActiveRecord::Base
def bespoke_query(params)
query = sanitize_sql(['select * from somewhere where a = ?', params[:search]])
connection.execute(query)
end
end
可以send
的方法来尝试一下控制台上也:
> MyModel.send(:sanitize_sql, ["Evening Officer ?", "'Dibble'"])
=> "Evening Officer '\\'Dibble\\''"
的ActiveRecord有消毒方法,可以让你先清理查询。 也许这是你可以看看的东西:http://apidock.com/rails/v4.1.8/ActiveRecord/Sanitization/ClassMethods/sanitize
我会非常小心地直接插入参数,但是。 你遇到什么问题,你不能使用ActiveRecord?
我想'查询= sanitize_sql('选择* from somewhere where a =?',params [:search])'应该是'query = sanitize_sql(['select * from somewhere where a =?',params [:search]])'编辑 – allthesignals 2015-09-08 01:07:24
。谢谢。 – Shadwell 2015-09-08 07:58:00