SQLインジェクション
ActiveRecordにおけるSQLインジェクション
ActiveRecordを用いた以下のコードはプロジェクトテーブルからプロジェクト名の一致するレコードをSELLECTするクエリであるが、ある危険を孕んでいる。
Project.where("name = '#{params[:name]}'")
このコードはSQL Queryとしては以下のように解釈される。
SELECT * FROM projects WHERE name = '#{params[:name]}'
この時#{params[:name]}
に以下の検索語が挿入されたらどうなるだろうか。
' OR 1 --
--
はそれ以下の文字をコメントとして解釈することを示している。また、OR 1
とすることで常にtrueを返すようにしてしまっている。つまり以下のようになるSQL QueryはProjectテーブルのレコードを全件取得してしまうのだ。
SELECT * FROM projects WHERE name = '' OR 1 --'
このように、開発者の意図しないようなSQL Queryを発行し、認証をすり抜けたりSQL内のデータ改ざんや身勝手な閲覧をすることをSQLインジェクションという。
対抗策
このような不正に対してRoRは特殊文字をフィルターすることで対応している。フィルターするためには以下のように?を用いる。
Project.where("name = ?", params[:name])
また、以下のようにhashでわたすことも可能だ。
Project.where(name: params[:name])