Является ли поиск в Rails 3 уязвимым для SQL-инъекций? - PullRequest
2 голосов
/ 24 ноября 2010

Предположим, у меня есть окно поиска на странице в приложении 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-кода? Я не вижу этого, но опять же, он не использует подготовленные операторы, поэтому мне интересно. Если есть уязвимость, как я могу сделать это более безопасно?

1 Ответ

5 голосов
/ 24 ноября 2010

Нет, здесь нет уязвимости SQL-инъекции. ActiveRecord вызовет connection.quote для значений хэша, которые вы передали в качестве второго параметра where, так что вы в безопасности.

Единственная потенциальная точка внедрения SQL, о которой я мог подумать, была бы, если бы была какая-то необнаруженная ошибка в connection.quote, что маловероятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...