SQL-инъекция по запросу Activerecord - PullRequest
1 голос
/ 16 сентября 2011

У меня сейчас есть это:

products = Product.select("DISTINCT(products.id), products.*").joins("JOIN (SELECT * FROM `shop_categorizations` WHERE (shop_categorizations.shop_category_id IN (SELECT id FROM `shop_categories` WHERE (`shop_categories`.shop_id = #{id} AND (`shop_categories.id` IN (#{shop_categories})))))) AS `shop_categorizations` ON `shop_categorizations`.`product_id` = `products`.`id`");

Я думал, что этот запрос будет подвержен внедрению SQL. Как сделать этот запрос безопасным от него? Я предполагаю обязательный, но я не знаю, как применить это здесь.

Фон на моделях, если это поможет:

Product belongs to ShopCategory
ShopCategory belongs to Shop

1 Ответ

3 голосов
/ 16 сентября 2011

В вашем случае, я думаю, вам не нужно связывать.Оба параметра являются Fixnum, вы можете просто преобразовать ввод в Fixnum для защиты от внедрения SQL:

JOIN (SELECT * FROM shop_categorizations WHERE (shop_categorizations.shop_category_id IN (SELECT id FROM shop_categoriesГДЕ (shop_categories .shop_id = # { id.to_i } И (shop_categories.id IN (# { shop_categories.map (&: to_i) }))))))AS shop_categorizations ON shop_categorizations. product_id = products. id

Если вам действительно нужно обрабатывать строковые типы данных, вы можете предотвратить внедрение SQL, экранируя / цитируя его,см .: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Quoting.html#method-i-quote

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