SQLインジェクションの仕組みと対策:バインド機構で根本から防ぐ

入力を悪用してDBを不正操作するSQLインジェクションの仕組みと、プレースホルダによる根本対策を解説する。

編集・検証: 情報セキュリティマネジメントスタディ編集部 公式情報: IPA 情報セキュリティマネジメント試験公式ページ 制作・検証方針

今回はWebアプリの代表的な脆弱性、SQLインジェクションを学ぶわ。仕組みと正しい対策を押さえましょう。

紺野 アキ(普段) 紺野 アキ

SQLインジェクションって名前は聞くけど、結局どういう攻撃なの?

銀城 ナディア 先生(笑顔) 銀城 ナディア 先生

SQLインジェクションは、入力欄などから不正なSQL文の断片を送り込んで、データベースを操作する攻撃よ。

灰原 さや(普段) 灰原 さや

アプリが利用者の入力をそのままSQL文に組み込んでしまうのが原因ですね。

銀城 ナディア 先生(普段) 銀城 ナディア 先生

そのとおり。
たとえばログイン処理で、入力値を文字列連結でSQLに埋め込んでいると危ないの。

薔薇崎 ねむ(普段) 薔薇崎 ねむ

どんなふうに悪さされるんですかぁ?

銀城 ナディア 先生(普段) 銀城 ナディア 先生

たとえばパスワード欄に ' OR '1'='1 のような文字列を入れられると、条件が常に真になって、認証を回避されてしまうことがあるのよ。

紺野 アキ(びっくり) 紺野 アキ

うわっ、パスワード知らなくてもログインできちゃうってこと?

銀城 ナディア 先生(普段) 銀城 ナディア 先生

ええ。
さらに悪用されると、データベース内の個人情報を情報漏えいさせられたり、データを改ざん・削除されたりするわ。

灰原 さや(普段) 灰原 さや

では対策はどうすればよいのでしょうか。
入力のチェックだけでよいのですか?

銀城 ナディア 先生(笑顔) 銀城 ナディア 先生

最も確実なのはプレースホルダを使ったバインド機構よ。
SQLの構文と入力値を分けて扱うので、入力値が命令として解釈されなくなるの。

灰原 さや(普段) 灰原 さや

いわゆるプリペアドステートメントですね。
値をパラメータとして安全に渡す仕組みです。

薔薇崎 ねむ(普段) 薔薇崎 ねむ

自分で連結する前に、特別な文字を無害にする方法も聞いたことがありますぅ。

銀城 ナディア 先生(普段) 銀城 ナディア 先生

それがエスケープ処理ね。
' などSQLで意味を持つ文字を無害な形に変換するの。
ただし漏れが起きやすいので、原則はバインド機構が推奨されるわ。

紺野 アキ(普段) 紺野 アキ

入力チェックはしなくていいの?

銀城 ナディア 先生(笑顔) 銀城 ナディア 先生

入力値検証も多層防御として大切よ。
加えて、DBのエラーメッセージを利用者に詳しく返さないことも、攻撃者へのヒントを与えない対策になるわ。

灰原 さや(普段) 灰原 さや

アプリがDBに接続する権限を必要最小限にしておくことも被害を抑えますね。

薔薇崎 ねむ(普段) 薔薇崎 ねむ

根っこは『入力をSQLの一部にしない』ことなんですねぇ。

確認クイズ

SQLインジェクション対策として最も根本的で有効なものはどれか。

  1. 利用者に強固なパスワードを設定させる
  2. プレースホルダを用いたバインド機構でSQL文を組み立てる
  3. 通信をTLSで暗号化する
  4. ログイン失敗回数を制限する
こたえを見る

正解: 2. プレースホルダを用いたバインド機構でSQL文を組み立てる

正解はバインド機構(プレースホルダ)。SQLの構文と入力値を分離するため、入力値がSQL命令として解釈されず、注入を根本的に防げる。強固なパスワードやログイン失敗回数制限はパスワード攻撃対策、TLSは通信の盗聴・改ざん対策であり、いずれもSQLインジェクションの本質的対策にはならない。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。