SQLインジェクションについてのメモ
SQLインジェクションとは...
SQLとは、データベースにアクセスするときの言語
インジェクション(injection)とは、注入・挿入などの意味
つまり、SQLインジェクションは、攻撃者が、データベースに悪意のあるSQL文を挿入して、不正に情報を引き出したりすること。
流れとしては...
攻撃者が悪意のあるSQLをWebサイトに入力
↓
Webサイトが悪意のあるSQLをデータベースへ実行
↓
何も知らないデータベースは素直にSQL文を実行することで、
データが消されたり、攻撃者の元に個人情報が表示されたりする
どんな被害が出るのか
・データベース内の情報の漏洩
・データベースの内容の改竄、消去
上記の2つが調べるとよく出てくる被害です。
具体的な攻撃方法
railsで、以下のようなコードがあったとする。
Room.where("user = '#{params[:user]}'")
上記のコードは、入力欄にuser(もさねい)を入れたらデータベースから一致するuserを返すSQL文となる。こんな感じで↓
SELECT 'rooms'. FROM 'rooms' WHERE (user = 'もさねい')
この時に、悪意を持ったSQL( a' OR '1'='1 )を入力欄に挿入すると...
SELECT 'rooms'. FROM 'rooms' WHERE (user = 'a' OR '1'='1')
上記のようなSQL文がデータベースで実行されてしまう。
上記のSQL文の意味としては、userが'a'と一致するか、'1'が'1'と等しい時にroomsの全ての情報を取り出すという意味になる。
ここで、'1'='1'は常に、条件が真になる為、SQLは全ての情報をWebサイトに返してしまうということ。
どのような対策ができるのか...
ずばり、プレースホルダーを使うと良いそう
プレースホルダーとは下記の?の部分で、変数や式などを埋め込む場所のこと。
SELECT * FROM rooms WHERE user = ?
railsだったら...
Room.where("user=?", params[:user])の
のようになる。
また、そもそもrailsであれば以下のようにシンボルを使って書くことが多いと思う。
Room.where(user: params[:user])
まとめ
何気なくシンボルで書いていた、railsのコードがSQLインジェクションを防いでいたことに驚いたが、調べてみるとSQLインジェクションの奥はふかそなので、SQLインジェクションについては、もっと調べてみる必要があると感じた。
また、徳丸本と言われる本にはSQLインジェクション以外にも安全にWebアプリケーションを作る方法が載っているそうなので、どこかで読んでみたいと思う。
この記事が気に入ったらサポートをしてみませんか?