コンテンツへスキップ
uencoder

SQL インジェクション(SQLi)攻撃を防ぐ

SQLi はユーザー入力を通じて悪意のある SQL を注入します。パラメータ化クエリ、入力バリデーション、最小権限の原則を学びましょう。

  1. 1

    SQL インジェクション(SQLi)は、ユーザー入力が SQL クエリーに連結されるときに発生します。例:"SELECT * FROM users WHERE name = '" + input + "'" — 入力 ' OR 1=1 -- ですべてのユーザーが返ります。対策:(1) パラメータークエリー/プリペアドステートメント(主防御)— クエリーとデータを別々に送るため、データベースがデータを SQL として解釈することはありません。(2) 入力バリデーション(副次)。(3) 最小権限 — データベースユーザーには必要なことだけを許可する。(4) パラメータークエリーを使う ORM。

  2. 2
    SQL フォーマッター →

    SQL クエリーを整形して、インジェクションを受けやすいパターンを特定します。文字列連結('...' + input + '...')、動的 SQL(EXEC)、パラメーター化されていないクエリーを探してください。プレースホルダー(?, :name)付きのクエリーを整形して、パラメーター化された形を示します。

  3. 3
    正規表現置換ツール →

    クエリーで使う前に、入力を検証してサニタイズします。許可する文字をホワイトリストにします(識別子は英数字、日付/メールアドレスは特定のパターン)。SQL メタ文字('、"、;、--、/*、*/)を含む入力は拒否します。注意:バリデーションは副次的です。主防御としては、常にパラメータークエリーを使ってください。

よくある質問

パラメータークエリーは 100% 安全ですか?
データ値については、そのとおりです。データベースはパラメーターを SQL ではなくデータとして扱います。ただし、パラメータークエリーは識別子(テーブル名、列名)には使えません。識別子はホワイトリストで検証する必要があります。識別子を連結した動的 SQL(EXECUTE/EXEC)は依然として脆弱です。識別子には ORM のクエリービルダーかホワイトリスト検証を使ってください。
ブラインド SQL インジェクションとは何ですか?
アプリケーションが SQL エラーやクエリー結果を直接返さない場合のインジェクションです。攻撃者は挙動を観察して情報を推測します。真偽値ベース(条件の真偽でページが変わる)、時間ベース(条件が真なら SLEEP() が応答を遅らせる)、アウトオブバンド(DNS/HTTP による持ち出し)。パラメータークエリーは、ブラインドを含むすべての形態の SQLi を防ぎます。

このタスクを解決するワークフロー

関連ツール