「SQLインジェクションって聞いたことあるけど、何が危険なの?」「セキュリティ対策って難しそう…」
Web開発を学んでいると必ず出てくるSQLインジェクション。実は、この攻撃手法は最も被害件数が多いサイバー攻撃のひとつです。2023年には前年比150%も被害が増加したというデータもあります。
この記事では、SQLインジェクションとは何か、どんな仕組みで攻撃されるのか、どう対策すればいいのかを、初心者の方にもわかりやすく解説します。
SQLインジェクションとは?
SQLインジェクションとは、Webサイトの入力フォームなどを悪用して、データベースを不正に操作する攻撃手法です。
まず、言葉の意味を確認しましょう。
| 用語 | 意味 |
|---|---|
| SQL | データベースを操作するための言語(Structured Query Language) |
| インジェクション | 注入・挿入という意味の英語(Injection) |
つまり、SQLインジェクションとは「不正なSQL文を注入する攻撃」という意味です。
どこから攻撃されるの?
SQLインジェクションの主な攻撃対象は、以下のようなユーザーが情報を入力する部分です。
- ログインフォーム(ID・パスワード入力欄)
- 検索ボックス
- お問い合わせフォーム
- 会員登録フォーム
これらの入力欄に、本来想定されていない特殊なSQL文を入力することで、データベースを不正に操作できてしまうのです。
SQLインジェクションの仕組みを図解
具体的にどのような仕組みで攻撃が成立するのか、ログインフォームを例に見てみましょう。
通常のログイン処理
まず、正常なログイン処理の流れです。
- ユーザーがIDとパスワードを入力
- Webアプリケーションが入力値をもとにSQL文を作成
- データベースでIDとパスワードが一致するか確認
- 一致すればログイン成功、しなければ失敗
例えば、IDに「taro」、パスワードに「pass123」と入力した場合、以下のようなSQL文が生成されます。
SELECT * FROM users WHERE id = 'taro' AND password = 'pass123'
このSQL文は「usersテーブルから、idがtaroでpasswordがpass123のデータを取得する」という意味です。
SQLインジェクション攻撃の場合
では、攻撃者が悪意を持って入力した場合はどうなるでしょうか。
パスワード欄に以下のような文字列を入力したとします。
' OR '1'='1
すると、生成されるSQL文はこうなります。
SELECT * FROM users WHERE id = 'taro' AND password = '' OR '1'='1'
このSQL文の条件部分を整理すると、「(idがtaro かつ passwordが空) または ‘1’=’1’」となります。
ここで問題なのは‘1’=’1’は常に成立するということ。つまり、パスワードが間違っていても、この条件式は必ず「真」になり、認証をすり抜けてログインできてしまうのです。
SQLインジェクションで起こる被害
SQLインジェクション攻撃が成功すると、どのような被害が発生するのでしょうか。
1. 情報漏洩
最も多い被害が個人情報の漏洩です。
- 氏名、住所、電話番号、メールアドレス
- クレジットカード情報
- IDとパスワード
- 企業の機密情報
実際に、数万件〜数千万件規模の個人情報が流出した事例も少なくありません。
2. データの改ざん・削除
データベース内の情報を勝手に書き換えたり、削除したりすることも可能です。
- 商品価格の改ざん
- 会員情報の書き換え
- 重要なデータの削除
3. Webサイトの改ざん
Webサイト自体を改ざんされ、マルウェア(悪意のあるソフトウェア)を仕込まれることもあります。サイトを訪れたユーザーが感染してしまう二次被害につながります。
4. 認証の回避
前述の例のように、正しいパスワードを知らなくてもログインできてしまうケースがあります。管理者アカウントに不正ログインされると、被害は甚大です。
実際の被害事例
SQLインジェクションによる被害は、国内外で多数報告されています。
| 年 | 業種 | 被害内容 |
|---|---|---|
| 2008年 | 音響機器通販 | クレジットカード情報約3万件流出、補償などで6,000万円以上の損害 |
| 2011年 | ゲーム会社 | 7,700万件以上の個人情報流出 |
| 2019年 | ECサイト | クレジットカード情報を含む個人情報流出 |
被害を受けた企業は、顧客への補償、セキュリティ対策強化、信用失墜など、多大な損害を被っています。
CASUAL TALK
服装自由・オンライン対応
まずは気軽に話しませんか?
応募じゃなくてOK。「ちょっと話を聞いてみたい」だけでも大歓迎。30分のカジュアル面談で、あなたの可能性が見えてきます。
カジュアル面談を予約するSQLインジェクションの対策方法
では、SQLインジェクションを防ぐにはどうすればいいのでしょうか。主な対策方法を5つ紹介します。
1. プレースホルダ(プリペアドステートメント)を使う
最も効果的な対策が、プレースホルダ(プリペアドステートメント)の使用です。
プレースホルダとは、SQL文の中で「ここに値が入りますよ」という場所を示す記号(通常は「?」)のこと。この方法を使うと、入力値はあくまで「値」として扱われ、SQL文として解釈されなくなります。
PHPの例を見てみましょう。
// ❌ 危険な書き方(直接SQL文に埋め込む)
$sql = "SELECT * FROM users WHERE id = '$id' AND password = '$password'";
// ✅ 安全な書き方(プレースホルダを使う)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? AND password = ?");
$stmt->execute([$id, $password]);
プレースホルダを使えば、たとえ「’ OR ‘1’=’1」のような文字列が入力されても、それは単なる文字列として処理され、攻撃は成立しません。
2. エスケープ処理を行う
エスケープ処理とは、SQLで特別な意味を持つ文字(シングルクォート「’」など)を無害な文字に変換する処理です。
例えば、シングルクォート「’」を「”」(シングルクォート2つ)に変換することで、SQL文として解釈されることを防ぎます。
3. 入力値を検証する
フォームに入力できる値を制限することも有効です。
- 数字のみ許可するフィールドには数字以外を受け付けない
- メールアドレスの形式をチェックする
- 入力可能な文字数を制限する
4. WAFを導入する
WAF(Web Application Firewall)は、Webアプリケーションへの攻撃を検知・防御するセキュリティツールです。
SQLインジェクションのパターンを検知して、攻撃をブロックしてくれます。プログラムの修正が難しい場合や、追加の防御層として導入されることが多いです。
5. 最新バージョンを使う
OSやデータベース、フレームワークを常に最新の状態に保つことも重要です。
発見された脆弱性は、バージョンアップで修正されることが多いため、定期的なアップデートがセキュリティ対策の基本となります。
エンジニアとしてセキュリティを学ぶ重要性
SQLインジェクションは、Web開発において必ず理解しておくべき基本的なセキュリティ知識です。
OWASP(Open Web Application Security Project)が発表する「OWASP Top 10」というWebアプリケーションのセキュリティリスクトップ10でも、インジェクション系の脆弱性は常に上位にランクインしています。
エンジニアとして働く以上、「セキュリティは専門家に任せる」ではなく、基本的な攻撃手法と対策を理解しておくことが求められます。
まとめ
この記事で解説した内容をまとめます。
| 項目 | 内容 |
|---|---|
| SQLインジェクションとは | 入力フォームに不正なSQL文を注入し、データベースを不正操作する攻撃 |
| 攻撃対象 | ログインフォーム、検索ボックス、お問い合わせフォームなど |
| 主な被害 | 情報漏洩、データ改ざん・削除、認証回避、Webサイト改ざん |
| 最も効果的な対策 | プレースホルダ(プリペアドステートメント)の使用 |
| その他の対策 | エスケープ処理、入力値検証、WAF導入、バージョン管理 |
SQLインジェクションは古くからある攻撃手法ですが、今でも被害が絶えません。対策自体は難しくないので、開発の初期段階からセキュリティを意識した実装を心がけましょう。
セキュリティの基本を押さえたエンジニアは、どの現場でも重宝されます。未経験からエンジニアを目指す方も、ぜひこの機会にセキュリティの基礎を身につけてください。
CASUAL TALK
服装自由・オンライン対応
まずは気軽に話しませんか?
応募じゃなくてOK。「ちょっと話を聞いてみたい」だけでも大歓迎。30分のカジュアル面談で、あなたの可能性が見えてきます。
カジュアル面談を予約する