ハッカー対策サービスを展開する株式会社サーバーセキュリティクラウドの発表によるとサーバー攻撃数が前年から微増傾向となり、特に「SQLインジェクション」は前年同月比150%であることがわかりました。
SQLインジェクションを受けるとデータベースのデータを不正に取得・改ざん出来てしまい、個人情報の漏洩につながる恐れもあるため十分な対策が必要になります。
この記事では初心者向けにSQLインジェクションの仕組みと対策方法について、解説していきます。
SQLインジェクションの仕組み
SQLインジェクションとはWebアプリケーションの入力フォームなどにSQLを注入して、データベースのデータを不正に取得したり改ざんしたりする手法のことを指します。
たとえば代表的な例はECサイトや会員制Webサイトのログイン画面です。
ユーザーIDの入力欄が存在するとして以下のようなSQLを実装したとします。
SELECT * FROM User WHERE user_id = <ユーザーID>;
上記の実装ではUserテーブルに対してuser_idカラムが入力値と等しい場合に対象のレコードを取得する処理となります。
ユーザーIDに「usagi」と入力した場合は以下のようなSQLになり、ユーザーIDが「usagi」の情報が取得されます。
SELECT * FROM User WHERE user_id = 'usagi';
当然ながらユーザーIDが「usagi」の情報がなければデータが取得されませんが、「usagi」に続いて「’ OR ‘1’=‘1」が注入(Injection)された場合は以下のようなSQLとなります。
SELECT * FROM User WHERE user_id = 'usagi' OR '1' = '1';
「usagi' OR '1' = '1」という文字列がSQLに組み込まれた際に「'usagi' OR '1' = '1'」となることで、2つ目の条件式が不正に生成されてしまいました。
「'1' = '1'」という条件式は必ず成立するため、Userテーブルに格納されているすべてのデータが取り出されてしまいます。
これがSQLインジェクションによる情報漏洩となります。
あくまでも一例で、悪用できる操作はもっと多岐にわたります。
SQLインジェクションの対策
SQLインジェクションの主な対策方法を5つ紹介いたします。
1. エスケープ処理をする
SQLで意味を持つ文字列を他の文字に置き換えることで悪意ある攻撃を防ぐことができます。
たとえばSQLの特殊文字であるシングルクォート「'」をダブルクォート「"」に変更するのが
PHPの実装で例えると以下のようになります。
// 入力値
$input = "usagi' OR '1' = '1";
// シングルクォートをダブルクォートに置換
$replaceInput = preg_replace('/\'/', '"', $input); // usagi" OR "1" = "1 に変換される
// SQLを作成
$sql = "SELECT * FROM User WHERE user_id = {$replaceInput}";
2. プレースホルダーを利用する
先ほどの例のように置き換えるのも良いですが、プレースホルダーを使うと型の判定をプレースホルダーが行ってくれるため漏れの心配がなく安全です。
PHPの実装で例えると以下のようになります。
(説明用にDB接続などの処理は省いています)
// 入力値
$input = "usagi' OR '1' = '1";
// SQLを作成
$sql = "SELECT * FROM User WHERE user_id = :user_id";
// バインドする
bind_param("s", $input);
3. 入力値を制限する
たとえば入力可能な文字を英数字のみに制限して、入力フォームの時点で特殊文字を受け付けないようにするというのも有効な対策です。
4. Webアプリケーションを最新バージョンに保つ
OSやアプリケーションのアップデートでは脆弱性を修正した内容が含まれることもあるため、常に最新バージョンに保つことで攻撃を受けるリスクを軽減することができます。
5. WAFの導入
WAFとは「Web Application Firewall」の略称で、Webサイトをアプリケーションレベルで防御するセキュリティ対策ツールのことです。
Webサイトへの通信を確認し不正なリクエストがあった場合は通信を遮断し防御してくれます。
まとめ
Webサイトの脆弱性を悪用されデータを不正に取得・改ざんされてしまうのがSQLインジェクションです。
適切な対策を取らずに放置していると情報漏洩などのリスクにつながりますので、安全性を高めるためにも十分な対策を行っていきましょう。