避免使用connection.execute进行sql注入

问题描述 投票:9回答:3

如果无法使用ActiveRecord有效地表达查询,在插值传递的ActiveRecord::Base.connection.execute属性时如何安全地使用params

connection.execute "... #{params[:search]} ..."
ruby-on-rails security ruby-on-rails-4
3个回答
11
投票
您必须小心一点,因为它们受到保护,因此仅适用于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\\''"

2
投票
sanitize方法,该方法可让您首先清除查询。也许您可以研究一下:http://apidock.com/rails/v4.1.8/ActiveRecord/Sanitization/ClassMethods/sanitize

尽管我会非常小心地像这样直接插入参数。您遇到什么问题,无法使用ActiveRecord?


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.