はい、そうです。ユーザーの入力をクエリ文字列に挿入するたびに、脆弱性があります。になる場合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;--')
これは2番目です
User Load (1.0ms) SELECT "users".* FROM "users" WHERE ("users"."deleted_at" IS NULL) AND (name = 'a'');delete from some_models where id=5;--')
2番目の追加に注意してください'
-query(name = 'a'')