Skip to main content

SQLインジェクション

Structured Query Languageインジェクション

関連するエラー

「このサーバーにはSQLインジェクション攻撃に対する脆弱性があります。入力されるSQLクエリが検証されていることを確認してください。」

問題

SQLインジェクション攻撃は、ウェブサイトとウェブアプリケーション内のコードに存在する脆弱性の一種です。この脆弱性により、攻撃者はバックエンドプロセスをハイジャックし、アプリケーションがそのデータベースに対して行うクエリに干渉できるようになります。

SQLインジェクション攻撃は、信頼できないソースからのプログラムにデータがが入力されるときに発生します。そのデータは次に、SQLクエリを動的に構築するために使用されます。

SQLインジェクション攻撃が成功すると、攻撃者は以下を実行できます。

  • パスワードなしでアプリケーションまたはウェブサイトのフロントエンドにログインする。

  • セキュア化されたデータベースに保存されているデータへのアクセス、変更、および削除を行う。

  • 独自のデータベースレコードを作成、または既存のレコードを変更して、さらなる攻撃を行う準備を整える。

ソリューション

SQLインジェクション攻撃を阻止するには、以下を実行します。

  1. パラメータ化されたクエリを用いたプリペアドステートメントを使用して、SQLステートメントに渡されるパラメータ(入力)が安全に処理されることを確実にします。

  2. 許可リストでの入力データ検証(ブロックリストを使用しない)。ブロックリストに基づいたユーザー入力をフィルタリングは行わないでください。大抵の場合、攻撃者はそのリストを回避する方法を見つけます。可能であれば、ユーザー入力の検証とフィルタリングには厳格な許可リストのみを使用してください。

  3. パラメータ化されたクエリと入力データの検証が不可能である場合は、入力パラメータで特殊文字をエスケープします。

  4. 最小権限の原則を実施することでウェブサイトに対するアクセスコントロールを強化し、セキュリティ脅威を低減します。

    • アクションを実行するための最小限のシステム権限を使用します。

    • 権限を付与するのは、アクションが必要となる期間のみに限定します。

    • アプリケーションアカウントに管理者アクセス権を付与しないでください。

    • 環境内の各データベースアカウントの権限を最小限に抑えます。