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])

参考にしたもの

Ruby on Rails Security Guide — Ruby on Rails Guides