SQL インジェクション(SQLi)攻撃を防ぐ
SQLi はユーザー入力を通じて悪意のある SQL を注入します。パラメータ化クエリ、入力バリデーション、最小権限の原則を学びましょう。
- 1
SQL インジェクション(SQLi)は、ユーザー入力が SQL クエリーに連結されるときに発生します。例:"SELECT * FROM users WHERE name = '" + input + "'" — 入力 ' OR 1=1 -- ですべてのユーザーが返ります。対策:(1) パラメータークエリー/プリペアドステートメント(主防御)— クエリーとデータを別々に送るため、データベースがデータを SQL として解釈することはありません。(2) 入力バリデーション(副次)。(3) 最小権限 — データベースユーザーには必要なことだけを許可する。(4) パラメータークエリーを使う ORM。
- 2 SQL フォーマッター →
SQL クエリーを整形して、インジェクションを受けやすいパターンを特定します。文字列連結('...' + input + '...')、動的 SQL(EXEC)、パラメーター化されていないクエリーを探してください。プレースホルダー(?, :name)付きのクエリーを整形して、パラメーター化された形を示します。
- 3 正規表現置換ツール →
クエリーで使う前に、入力を検証してサニタイズします。許可する文字をホワイトリストにします(識別子は英数字、日付/メールアドレスは特定のパターン)。SQL メタ文字('、"、;、--、/*、*/)を含む入力は拒否します。注意:バリデーションは副次的です。主防御としては、常にパラメータークエリーを使ってください。
よくある質問
- パラメータークエリーは 100% 安全ですか?
- データ値については、そのとおりです。データベースはパラメーターを SQL ではなくデータとして扱います。ただし、パラメータークエリーは識別子(テーブル名、列名)には使えません。識別子はホワイトリストで検証する必要があります。識別子を連結した動的 SQL(EXECUTE/EXEC)は依然として脆弱です。識別子には ORM のクエリービルダーかホワイトリスト検証を使ってください。
- ブラインド SQL インジェクションとは何ですか?
- アプリケーションが SQL エラーやクエリー結果を直接返さない場合のインジェクションです。攻撃者は挙動を観察して情報を推測します。真偽値ベース(条件の真偽でページが変わる)、時間ベース(条件が真なら SLEEP() が応答を遅らせる)、アウトオブバンド(DNS/HTTP による持ち出し)。パラメータークエリーは、ブラインドを含むすべての形態の SQLi を防ぎます。
このタスクを解決するワークフロー
関連ツール
SQL フォーマッター
Beautify or minify SQL queries online. Uppercase keywords, indent clauses, or compress to a single line。無料、プライベート、100%クライアントサイド。 ツール
正規表現置換ツール
Find and replace text using regular expressions。無料、プライベート、100%クライアントサイド。 ツール
HTML エスケープツール
Escape or unescape HTML special characters online。無料、プライベート、100%クライアントサイド。 ツール