да, это так. Каждый раз, когда вы вводите ввод пользователя в строку запроса, он уязвим. Если month
будет:
5' AND '8'; DROP TABLE timeslots;--
вы можете быть в серьезные неприятности. Не говоря уже о отбрасывания базы данных и т.д.
Я не воспроизводится именно этот запрос, но что-то подобное [я должен был добавить) в моем запросе за счет использования acts_as_paranoid плагин]:
SomeModel.pluck(:id)
=> [1, 2, 4, 3, 5, 6]
abc = 'a\');delete from some_models where id=6;--'
User.where("name = '#{abc}'")
=> []
SomeModel.pluck(:id)
=> [1, 2, 4, 3, 5] # please note that record with id 6 was deleted!
Причина, почему атака была возможна, я мог бы предоставить '
и --
(который начинает комментарий). Когда вы используете предложенный способ, то есть используете .where («name =?», «My_name»), тогда атака будет невозможна. Проверьте это:
abc = 'a\');delete from some_models where id=5;--'
User.where("name = ?", abc)
=> []
SomeModel.pluck(:id)
=> [1, 2, 4, 3, 5] # this time record with id 5 was not deleted
Это первый запрос:
User Load (1.5ms) SELECT "users".* FROM "users" WHERE ("users"."deleted_at" IS NULL) AND (name = 'a');delete from some_models where id=6;--')
Это второй
User Load (1.0ms) SELECT "users".* FROM "users" WHERE ("users"."deleted_at" IS NULL) AND (name = 'a'');delete from some_models where id=5;--')
Обратите внимание на второй дополнительный '
- query(name = 'a'')
Просто Интонацию , Я нашел несколько случаев, когда выполнение params [: id] .to_i' спасло нас от уязвимостей безопасности в рельсах. Таким образом, даже рельсы заявляют, что избегают параметров в данном методе, не доверяйте никому :) –
Можете ли вы рассказать о том, как «params [: id] .to_i' предотвратили уязвимости системы безопасности? – Catfish
'' 1 ".to_i' возвращает целое число' 1'. '' some_string ".to_i' возвращает' 0' –