SQLインジェクションを防ぐ方法

最小特権アクセスの強制、ユーザー入力のサニタイジング、データベースに対する手続き内容の制限は、SQLインジェクションとそれに続くデータ漏洩の防止に有用です。

学習目的

この記事を読み終えると、以下のことができるようになります。

  • SQLインジェクションの仕組みを説明
  • SQLインジェクションを阻止するためのベストプラクティスを確認する
  • CloudflareがSQLi攻撃を防ぐ方法を学ぶ

関連コンテンツ


さらに詳しく知りたいとお考えですか?

是非、Cloudflareが毎月お届けする「theNET」を購読して、インターネットで最も人気のある洞察をまとめた情報を入手してください!

当社がお客様の個人データをどのように収集し処理するかについては、Cloudflareのプライバシーポリシーをご確認ください。

記事のリンクをコピーする

SQLインジェクション攻撃の仕組み

構造化照会言語インジェクション(SQLi)は、コードインジェクション攻撃の1つであり、攻撃者はSQLデータベースにある機密情報を取得、操作、破壊することができます。これらの攻撃は、SQLクエリフィールドに特殊なコマンドを挿入することで機能します。コマンドが実行されると、攻撃者は自身を正規ユーザーであるかのように身元を詐称したり、保護されたデータを閲覧または取得したり、さらにはサーバーのルートアクセス権を取得することが可能になります。

多くの場合、攻撃者は、正当なコードと信頼できないコードを適切に区別できないようにアプリケーションプログラミングインターフェース(API)の脆弱性を悪用してSQLiを実行します。変更されたコマンドやクエリを検出する機能がない場合、これらのAPIによってWebアプリケーションファイアウォール(WAF)認証対策をすり抜けるなどの、悪意のあるリクエストが実行されてしまいます。

通常、SQLiは以下の3つのいずれかの手法で行われます:

  1. インバンドSQLインジェクションは、攻撃の開始と完了に1つの通信チャネルを使用します。インバンドSQLiの一般的な種類には、エラーベースのSQLi(攻撃者がエラーメッセージから基盤であるデータベースに関する重要な情報を探る方法)やUNIONベースのSQLi(攻撃者がSQLのUNION演算子を使用してデータベースの脆弱性を探る方法)があります。これはSQLiの最もシンプルで一般的な形式です。
  2. アウトバンドSQLインジェクションはインバンドとは対照的に、攻撃者は攻撃の開始と完了に同じ通信チャネルを使用することはできません。代わりに、侵害されたアプリケーションを使用して(多くの場合DNSやHTTPリクエストを経由して)攻撃者の制御下にあるリモートのエンドポイントまでデータを持ち出させる必要があります。これはSQLiの中で最も難易度の高い、最も使用頻度の低い形式です。
  3. 推測SQLインジェクション(別名ブラインドSQLi)は、標的となるサーバーにペイロードを送信して攻撃者が攻撃方法を習得する手法です。これは通常、ブールベースのブラインドSQLi(攻撃者がTRUEまたはFALSEが返されるクエリーを使用して、サーバーにさまざまなレスポンスを生成させる方法)と、時間ベースのブラインドSQLi(攻撃者がサーバーのレスポンスタイムの変化から同様の情報を推測する方法)の2つの形態のいずれかで行われます。これは多くの場合インバンドSQLiよりも時間がかかりますが、同等の損害を受ける可能性があります。

良性SQLクエリーと悪性SQLクエリーの実例については、SQLインジェクションとは?を参照してください。

SQLインジェクションを防ぐ方法

SQLインジェクションは最も一般的なAPIの脅威の1つではありますが、適切な予防戦略を講じることで効果的に回避することができます。SQLインジェクションを防ぐための有用なアプローチには、データベースに対する手続き内容の制限、データベース入力のサニタイジング、最小特権アクセス権の強制などがあります。

データベースに対する手続き内容とコードを制限する

SQLインジェクションは、データ入力やデータベース関数を操作する攻撃者の能力に大きく依存します。これらの入力を制限し、実行可能なデータベースに対する手続きの種類を制限することで、組織は不正または悪意のあるクエリのリスクを最小限に抑えることができます。その方法には次のようなものがあります:

  • プリペアドステートメントとパラメータ式クエリを強制する:プリペアドステートメントは、受入可能なSQLコードを定義し、入力されるクエリに対して特定のパラメータを設定します。悪意のあるSQL文は、実行可能なコマンドではなく、無効なデータ入力として分類されます。
  • ストアドプロシージャを使用する:ストアドプロシージャは、プリペアドステートメントと同様に、データベースからデータを取得するための用意された再利用可能なSQL構文であり、これを使用することで悪意のある行為者がデータベース自体に直接コードを実行させることを防ぎます。

データベースに対する入力の検証とサニタイズ

悪意のあるコードを排除するためには、SQLデータベースに対するユーザー入力を定期的に監視、検証、サニタイズする必要があります。入力の検証は、データが事前に定義された基準に従って適切に検査およびフォーマットされることを保証し、入力のサニタイズは、無効または安全でない文字を削除し、必要に応じて再フォーマットすることで、入力を修正(または「サニタイズ(浄化)」)します。入力検証を確実にする方法には、以下のようなものがあります:

  • 許可リストの確立:許可リストに有効とするユーザー入力を定義し、これを使用してデータベースに対して異常と思われるクエリをチェック(および拒否)することができます。例えば、特殊文字と拡張URLは、攻撃者が(悪意のあるクエリを実行する前に)データベースに関する情報を収集するために悪用できる2つのタイプのユーザー入力です。これらの入力の使用を制限することで、攻撃の可能性を最小限に抑えることができます。
  • ユーザー入力をエスケープする:特定の文字や単語が悪意のあるリクエストの形成に使われることのないように、ユーザーによる全入力をエスケープ(コマンドや条件文ではなく入力として扱う)することもできます。

最小特権アクセスを適用

最小特権アクセスとは、保護対象のリソースに対するアクセス権を、役割を果たすために必要な分だけユーザーに与えるという原則です。例えば、データベースの管理者レベルの権限を与えるユーザー数を制限したり、後で取り消すことを前提に一時的な管理者レベルのアクセス権を与えることもできます。

盗んだ認証情報を使用してデータベースに侵入した攻撃者も同様に、保護対象のデータの閲覧、修正、窃盗、破壊に必要な権限が制限されるため、ロールベースレベルでユーザーアクセスを制限することは、情報漏えいの影響を最小限に抑えるために有用です。同じ理由から、企業は複数のWebサイトやアプリケーションで使用するデータベースへの共有アクセスを制限する必要があります。

Cloudflareを使用してSQLインジェクションを防止する方法

Cloudflareは、企業がSQLi攻撃に対する耐性を高めるための強力なアプリケーションとAPIセキュリティ製品群を用意しています:

  • Cloudflare WAF:トラフィックパターンを監視してSQLの悪用の可能性、バイパス行為や攻撃の種類のバリエーションを検出し、これらに高度な機械学習技術を使用して進化する攻撃手法に合わせたWAFのルールセットを適応します。
  • Cloudflare D1Workersとネイティブに統合したサーバーレスSQLデータベースであり、プリペアドステートメントを実装することでユーザによるデータベースの変更や削除を防止します。