あなたが作ったWebサイト、本当に安全ですか?
想像してみてください。ログイン画面のパスワード欄に「' OR '1'='1」という文字列を入れただけで、全ユーザーのアカウントにアクセスできてしまう状況を。これは決して映画の中だけの話ではありません。SQLインジェクションによって、実際に多くの企業で個人情報の流出が発生しています。
でも、安心してください。適切なテストを行えば、脆弱性は事前に発見できます。本記事では、SQLインジェクションテストで使う具体的な入力値、実践的な手順、チェックツールの使い方まで解説します。
目次
SQLインジェクションテストとは?基本を理解しよう

SQLインジェクションテストを理解するために、まずは「図書館の司書」を思い浮かべてください。
あなたが図書館で本を探すとき、司書に「〇〇という本を探してください」と頼みますよね。この「指示」がデータベースへの命令、つまりSQL文に相当します。通常、司書はあなたの指示通りに本を探してくれます。
しかし、もしあなたが悪意を持って「〇〇という本を探してください。それと、ついでに金庫の鍵も持ってきて」と指示したらどうでしょう?もし司書がその指示をそのまま実行してしまったら、本来渡してはいけない金庫の鍵まで手に入ってしまいます。
これがSQLインジェクションの仕組みです。Webサイトの入力フォームやURLに、本来の指示に加えて「悪意のある命令」を紛れ込ませることで、データベースから機密情報を盗んだり、データを削除したりできてしまうのです。
実際の被害は深刻です。2018年には某ショッピングモールサイトで約24万件のメールアドレスとパスワードが流出し、2017年には某ECサイトでクレジットカード情報7,000件以上が漏洩しました。開発会社が数千万円の損害賠償を請求されたケースもあります。
だからこそ、SQLインジェクションテストが必要なのです。テストサイトを構築したり、自分の管理するサイトに対してテストを実施することで、攻撃者に先回りして脆弱性を見つけ出し、修正できます。セキュリティテストは「攻撃されてから対処する」のではなく、「攻撃される前に守る」ための重要な予防策なのです。
SQLインジェクションテストの入力値|代表的な例を紹介

ここでクイズです。攻撃者がログイン画面を突破するために使う、最もシンプルで強力な「魔法の呪文」は何だと思いますか?
答えは「' OR '1'='1」です。この短い文字列が、なぜこれほど危険なのか、攻撃者の視点で一緒に見ていきましょう。
or ‘1=1 パターン:最強のテスト入力値
通常、ログイン機能では以下のようなSQL文でユーザー認証を行います。
SELECT * FROM users WHERE username='入力されたユーザー名' AND password='入力されたパスワード'
ここでユーザー名に「admin」、パスワードに「' OR '1'='1」と入力すると、実際に実行されるSQL文はこうなります。
SELECT * FROM users WHERE username='admin' AND password='' OR '1'='1'
何が起きたでしょうか?パスワード部分のシングルクォート(')によって、本来のパスワード文字列が空で終了してしまい、その後に「OR '1'='1」という条件が追加されました。この「'1'='1」は常に真(正しい)なので、パスワードが間違っていても、条件全体が真になってログインできてしまうのです。
まるで「パスワードが合っているか、または1が1に等しいならログインOK」という指示になってしまったようなものです。1は常に1なので、誰でもログインできてしまいますよね。
バリエーション豊富なテスト入力値
実際のテストでは、さまざまな入力値を試します。以下は代表的な例です。
基本パターン:
' OR 'A'='A:or ‘1=1と同じ仕組みで、常に真になる条件' OR 1=1--:「--」はSQLのコメント記号で、以降の文を無効化admin'--:ユーザー名の後の条件をコメントアウト
エラー誘発パターン:
'(シングルクォート単体):SQL文の構造を壊してエラーを発生させる"(ダブルクォート単体):データベースによってはエラーが出る
これらの入力値でエラーメッセージが表示されたり、想定外の動作が起きたりすれば、SQLインジェクションの脆弱性が存在する可能性が高いということです。
危険なパターン(実環境では絶対に使用禁止):
'; DROP TABLE users--:usersテーブルを削除してしまう'; DELETE FROM users WHERE '1'='1:全ユーザーデータを削除
これらは実際のテストコマンドとしては危険すぎるため、自分が管理するテスト環境以外では絶対に使用しないでください。データが完全に失われる可能性があります。
ここでのポイントは、「なぜこの入力値が機能するのか」を理解することです。仕組みを知ることで、どこに脆弱性があるのか、どうテストすればいいのかが見えてきます。
SQLインジェクションテストの手順を実践してみよう

さて、テスト入力値の例を学んだところで、実際のテスト手順を見ていきましょう。ここでは初心者の方でも実践できるように、ステップバイステップで解説します。
【重要】テスト前の準備
まず最初に、絶対に守るべきルールがあります。
「他人のWebサイトやサービスに対して、許可なくSQLインジェクションテストを行ってはいけません」
これは法律違反になる可能性があります。必ず以下のいずれかの環境でテストしてください。
- 自分で構築したテスト用のWebサイト
- 会社から許可を得た開発環境やステージング環境
- 公開されている練習用の脆弱なサイト(OWASP WebGoatなど)
準備ができたら、テスト手順に進みましょう。
ステップ1:テスト対象を特定する
まず、SQLインジェクションが発生しそうな場所を見つけます。典型的なのは以下の箇所です。
- ログインフォーム(ユーザー名・パスワード入力欄)
- 検索フォーム
- URLパラメータ(例:
?id=123) - 商品詳細ページのID指定部分
例えば、商品詳細ページのURLが「https://example.com/product?id=5」だとしましょう。この「id=5」の部分がデータベースへの問い合わせに使われている可能性が高いです。
ステップ2:シングルクォートでエラーを誘発
最もシンプルなテストは、入力欄に「'」(シングルクォート)だけを入れてみることです。
フォームの場合:
検索ボックスに「'」と入力して検索ボタンをクリック
URLの場合:
「https://example.com/product?id=5'」のように、パラメータの後に「'」を追加
もしデータベースエラーのメッセージが表示されたり、ページが正常に表示されなかったりすれば、SQLインジェクションの脆弱性が存在する可能性があります。
ステップ3:テスト入力値で検証する
次に、先ほど学んだテスト入力値を試してみます。
検索フォームでのテスト例:
' OR '1'='1
URLでのテスト例:
https://example.com/product?id=5' OR '1'='1
脆弱性がある場合、以下のような現象が起きます。
- ログインフォーム:パスワードなしでログインできてしまう
- 検索フォーム:全件のデータが表示される
- 商品詳細:別の商品情報が表示される、または全商品が表示される
ステップ4:レスポンスを観察・記録する
テストを実施したら、以下の点を記録しましょう。
- 入力した値
- 表示されたエラーメッセージ(あれば)
- 通常と異なる動作
- データベースの種類が分かるヒント(エラーメッセージに「MySQL」「PostgreSQL」などの記載)
この記録は、開発チームが修正する際の重要な手がかりになります。
ステップ5:結果を報告する
脆弱性を発見したら、開発チームやセキュリティ担当者に報告します。報告には以下の情報を含めましょう。
- 脆弱性が見つかったURL・フォーム
- 使用したテスト入力値
- 発生した現象(スクリーンショット付きが望ましい)
- 推奨される対策方法(プリペアドステートメントの使用など)
このやり方を覚えておけば、基本的なSQLインジェクションテストは誰でも実施できます。
SQLインジェクションチェックツールを使ってみよう
手動でのテストも重要ですが、より効率的に、そして網羅的にテストを行うには専用のチェックツールが役立ちます。ここでは代表的なツールとその使い方を紹介します。
sqlmap:コマンドラインの定番ツール

sqlmapは、SQLインジェクションの脆弱性を自動で検出してくれるオープンソースのツールです。コマンドラインで動作するため、最初は少し難しく感じるかもしれませんが、非常に強力です。
基本的な使い方:
まずPythonをインストールし、sqlmapをダウンロードします。その後、以下のコマンドでテストを実行します。
python sqlmap.py -u "https://example.com/product?id=5"
このテストコマンドは、指定したURLに対してさまざまなSQLインジェクションのパターンを自動的に試してくれます。脆弱性が見つかれば、詳細なレポートを表示してくれます。
より詳細なテストコマンド:
python sqlmap.py -u "https://example.com/product?id=5" --level=3 --risk=2
--level:テストの深さ(1〜5、デフォルトは1)--risk:危険なテストを含めるレベル(1〜3、デフォルトは1)
レベルを上げると、より多くのパターンをテストできますが、時間がかかります。
OWASP ZAP:GUI付きで使いやすい
OWASP ZAP(Zed Attack Proxy)は、Webアプリケーションのセキュリティテストができる無料ツールです。GUIが付いているので、コマンドラインに不慣れな方でも使いやすいのが特徴です。
使い方の流れ:
- OWASP ZAPをダウンロード・インストール
- ブラウザのプロキシ設定をZAP経由にする
- テストしたいサイトを通常通り操作
- ZAPが自動的に通信を記録
- 「Active Scan」ボタンでSQLインジェクションを含む脆弱性をチェック
ZAPはSQLインジェクションだけでなく、XSS(クロスサイトスクリプティング)などの他の脆弱性も同時にチェックできるため、総合的なセキュリティテストに適しています。
VAddy:クラウド型で手軽
VAddyは日本製のクラウド型Web脆弱性診断ツールです。サインアップから最短10分でSQLインジェクションの検査ができるのが魅力です。
特に継続的にセキュリティテストを行いたい場合、開発サイクルに組み込みやすいのが特徴です。Seleniumと組み合わせることで、自動テストの一部としてセキュリティチェックを実施できます。
ツール使用時の重要な注意点
どのツールを使う場合も、以下の点に注意してください。
絶対にしてはいけないこと:
- 許可なく他人のWebサイトをテストすること
- 本番環境で直接テストすること(データ破壊のリスクがある)
- 営業時間中のテスト(サーバーに負荷がかかる)
推奨される使い方:
- テスト環境やステージング環境で実施
- テスト前にデータベースのバックアップを取得
- チームメンバーや管理者に事前通知
ツールは便利ですが、結果を正しく解釈するには、この記事で学んだような基礎知識が必要です。手動テストとツールを組み合わせることで、より確実なセキュリティテストが実現できます。
まとめ
SQLインジェクションテストは、Webアプリケーションのセキュリティを守るための重要な取り組みです。この記事では、実践的なテスト入力値から具体的な手順、さらに便利なチェックツールまでご紹介しました。
学んだポイントを振り返りましょう:
まず、SQLインジェクションは「図書館の司書への指示書」に悪意のある命令を紛れ込ませるような攻撃だと理解しました。そして、「' OR '1'='1」をはじめとする代表的なテスト入力値が、なぜ機能するのかを学びました。
実践的なテスト手順では、シングルクォートで脆弱性の存在を確認し、様々なテスト入力値で検証する方法を見てきました。URLパラメータやフォームに対して、段階的にテストを進めることで、脆弱性を確実に発見できます。
さらに、sqlmapやOWASP ZAPといったチェックツールを使えば、より効率的で網羅的なテストが可能になります。ただし、ツールを使う場合も、必ず許可された環境でのみ実施することを忘れないでください。
次のステップとして:
今日学んだ知識を、実際に自分のテスト環境で試してみましょう。まずは簡単なログインフォームを作成し、意図的に脆弱なコードを書いて、テスト入力値がどう動作するか確認してみてください。そして、プリペアドステートメントを使った安全なコードに修正し、同じテストをして脆弱性が解消されることを確認します。
セキュリティは一度対策すれば終わりではなく、継続的な取り組みが必要です。新しい機能を追加するたびに、開発サイクルの中でSQLインジェクションテストを実施する習慣をつけましょう。あなたのWebサイトを、そしてユーザーの大切な情報を守るために、今日からできることを始めてください。