Ruby on Rails のwhereメソッドの条件を文字列だけで構成するとはSQLインジェクションの危険がある。


Railsのwhereメソッドの条件を文字列だけで構成することは危険なようです。

Webサービス作成する中で「あるカラムに値が設定されているレコードを取得する」為、下記のようにコーディングしていました。

値が設定されていないだったらRailsのwhereメソッドに「selling_day:nil」みたいな感じで取得してあげれば良いかと思いますが

stocks_controller.rb
@stock = Goal.where('selling_day like ?','%')

ただ、文字列だけで条件を指定するとSQLインジェクションのリスクがあるようです。
具体的には

stocks_controller.rb
@stock = Goal.where("selling_day = '#{params[:day]}'")

みたいに書くとparams[:day]に悪意のある文字列を設定され、認証をすり抜けるリスクがあります。
下記のように条件をハッシュ値で指定するか、配列で指定するようにするとリスク回避できるようです。

stocks_controller.rb
@stock = Stock.where(sold:true)

下記サイトを参考にしました。
https://railsguides.jp/active_record_querying.html
https://railsguides.jp/security.html#sql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3