2015-02-06 10 views
8

Nếu truy vấn không thể được biểu diễn một cách hiệu quả bằng ActiveRecord, cách sử dụng an toàn ActiveRecord::Base.connection.execute khi nội suy thông qua các thuộc tính params?Tránh tiêm sql với connection.execute

connection.execute "... #{params[:search]} ..." 

Trả lời

7

Bạn có thể sử dụng các phương pháp trong ActiveRecord::Sanitization::ClassMethods.

Bạn phải cẩn thận một chút vì chúng được bảo vệ và do đó chỉ sẵn có cho các lớp con ActiveRecord::Base.

Trong một lớp mô hình mà bạn có thể làm điều gì đó như:

class MyModel < ActiveRecord::Base 

    def bespoke_query(params) 
    query = sanitize_sql(['select * from somewhere where a = ?', params[:search]]) 
    connection.execute(query) 
    end 

end 

Bạn có thể send phương pháp này để thử nó ra trên giao diện điều khiển quá:

> MyModel.send(:sanitize_sql, ["Evening Officer ?", "'Dibble'"]) 
=> "Evening Officer '\\'Dibble\\''" 
+2

Tôi nghĩ 'query = sanitize_sql (' chọn * từ đâu đó a =? ', params [: search]) 'nên là' query = sanitize_sql ([' chọn * từ đâu đó a =? ', params [: search]]) ' – allthesignals

+0

Đã chỉnh sửa. Cảm ơn. – Shadwell

Các vấn đề liên quan