Предположим, у меня есть окно поиска на странице в приложении Rails 3, где вы можете искать клиента по названию компании или городу. В методе индекса моего контроллера я делаю это:
if params[:search]
@clients = Client.where("clients.business_name LIKE :business_name OR clients.city = :city", :business_name => "%#{params[:search]}%", :city => params[:search])
Эти хеш-значения подставляются в SQL и заключаются в кавычки. Если мой ввод в поле поиска содержит кавычки или другие опасные символы, я увижу их в журнале разработки, например:
... ГДЕ (clients.business_name LIKE '% Something \' DROP TABLE Foo% '...
Или
...WHERE... OR clients.city = 'Something OR 1=1')
Таким образом, поскольку OR 1=1
находится внутри кавычек, которые добавляет Rails, оно просто не дает совпадения для названия города, а поскольку в кавычке в попытке DROP TABLE
не выполняется совпадение, оно также не дает совпадения для названия компании.
При этом не используются фактически подготовленные операторы, когда запрос сначала отправляется в базу данных без заполненных значений поиска, а затем, значения поиска отправляются в базу данных для заполнения. Я думал, что это самый безопасный подход , но Rails этого не делает; Я думаю, что это потому, что это доступно не во всех базах данных, и реализации различаются.
Это как-то открыто для внедрения SQL-кода? Я не вижу этого, но опять же, он не использует подготовленные операторы, поэтому мне интересно. Если есть уязвимость, как я могу сделать это более безопасно?