interlude

プログラミングや私的なこと

今更聞けないSQLインジェクションのこと

SQLインジェクションとは?

webアプリケーションを攻撃する手段のうちの1つで、 ユーザが入力フォームから送信した文字列をそのままSQLとして実行し、データベース内の値を操作して漏洩、改ざん、破壊してしまうことです。

例えば
SELECT * FROM user WHERE id='$ID'というSQLがある時、 一般ユーザのIDがjohnの場合
SELECT * FROM user WHERE id='john'
となりますが、悪意のあるユーザがSQLインジェクションで攻撃を行った場合
入力フォームにjohn' or 'A'='A'を入れたとすると
SELECT * FROM user WHERE id='john' or 'A'='A' となり、WHERE句全体が常に真の状態になってしまい、 その結果、データベース内の情報が引き出されてしまいます。

どのように防げばいいのか?

入力値のチェック

文字数は何文字以内、先頭3文字はアルファベット、末尾は数字などのように条件を細かく設定して ブラウザから渡された値が入力値として正しい形式かどうかを厳密にチェックします。ただこの際チェックするのはブラウザ上のjavascriptではなく、Webサーバ側で行う必要があります。まあ、ソース見られたら一目瞭然ですし。

プリペアードステートメントを使う

プリペアードステートメント->解析(コンパイル)済みのSQL文のこと。プレースホルダ(予約場所)に入力データをバインド(割り当てる)機能です。 ユーザから渡された値を検証してから、予めコンパイルされたSQLに渡すということをしているんですね。

まとめ

ユーザが入力した値をそのままSQLにしてしまうのが問題なので、エスケープ(特殊な意味を持つ記号や文字列を無効化する)処理が重要だということなんですね。

参考
http://www.ipa.go.jp/files/000024396.pdf

IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第6章 入力対策:SQL注入: #1 実装における対策

http://blog.a-way-out.net/blog/2013/12/19/sql-injection-prevention/