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

ave*_*ave 9 security ruby-on-rails ruby-on-rails-4

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

connection.execute "... #{params[:search]} ..."
Run Code Online (Sandbox Code Playgroud)

Sha*_*ell 11

您可以使用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
Run Code Online (Sandbox Code Playgroud)

您也可以通过send该方法在控制台上进行尝试:

> MyModel.send(:sanitize_sql, ["Evening Officer ?", "'Dibble'"])
=> "Evening Officer '\\'Dibble\\''"
Run Code Online (Sandbox Code Playgroud)

  • 我认为`query = sanitize_sql('select*from some where a =?',params [:search])`应该是`query = sanitize_sql(['select*from some where where a =?',params [:search]] )` (2认同)