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アプリケーションを作る方法が載っているそうなので、どこかで読んでみたいと思う。

この記事が気に入ったらサポートをしてみませんか?