ホームページ > バックエンド開発 > Python チュートリアル > SQL インジェクション攻撃を検出して防御する方法 (一部必読)

SQL インジェクション攻撃を検出して防御する方法 (一部必読)

Patricia Arquette
リリース: 2024-11-30 22:33:15
オリジナル
921 人が閲覧しました

How to Detect and Defend Against SQL Injection Attacks(Part-Must Read]

著者: Trix Cyrus

ウェイマップ侵入テストツール: ここをクリック
TrixSec Github: ここをクリック
TrixSec テレグラム: ここをクリック


SQL インジェクションは、Web アプリケーションで最も一般的かつ危険な脆弱性の 1 つです。これは、攻撃者がアプリケーションによって実行される SQL クエリを操作できるようになり、不正な方法でデータにアクセスしたりデータを変更したりできる場合に発生します。この記事では、SQL インジェクション攻撃を検出して防御する方法について説明します。


SQL インジェクションとは何ですか?

SQL インジェクション (SQLi) は、攻撃者が悪意のある SQL コードをクエリに挿入または「注入」し、データベース サーバーによって実行される攻撃の一種です。この脆弱性は、ユーザー入力が適切なサニタイズなしで SQL クエリに直接含まれる、不十分な入力検証によって発生します。

例:

SELECT * FROM users WHERE username = 'admin' AND password = 'password123';
ログイン後にコピー
ログイン後にコピー

攻撃者が次のように独自の SQL をクエリに挿入できる場合:

' OR 1=1; --
ログイン後にコピー
ログイン後にコピー

結果のクエリは次のようになります。

SELECT * FROM users WHERE username = '' OR 1=1; --' AND password = '';
ログイン後にコピー

これにより、データベースは認証を完全にバイパスし、すべてのユーザーを返します。


SQL インジェクション攻撃を検出する方法

1.検出に自動ツールを使用する

多くのセキュリティ ツールは、アプリケーションをスキャンして SQL インジェクションの脆弱性を見つけることができます。よく使われるツールには次のようなものがあります:

  • SQLmap: SQL インジェクションの脆弱性の検出と悪用を自動化する強力なツール。
  • ウェイマップ: SQL インジェクションの脆弱性とその他 75 個の Web 脆弱性の検出を自動化する強力なツールです。
  • OWASP ZAP: さまざまなアクティブおよびパッシブ SQL インジェクション テストを含む Web アプリケーション セキュリティ スキャナー。
  • Burp Suite: SQL インジェクション スキャン機能を提供する侵入テスト ツール。

2.手動テスト

  • 一般的な SQL インジェクション ペイロード をユーザー入力フィールドに挿入してみます。例:

    • ' OR 1=1 --
    • ' OR 'a' = 'a
    • ' AND 'x'='x
  • エラー メッセージを調べる: データベース エラー メッセージの多くは、基礎となるデータベースとクエリの構造に関する詳細を明らかにする可能性があります。例:

    • MySQL: SQL 構文にエラーがあります...
    • PostgreSQL: エラー: 整数型の入力構文が無効です

3.エラーベースおよびブラインドインジェクション手法を使用する

  • エラーベースのインジェクション: 意図的にエラーを引き起こすことで、攻撃者はエラー メッセージから有用な情報を収集できます。
  • ブラインド SQL インジェクション: エラー メッセージが無効になっている場合、攻撃者はアプリケーションの応答に基づいて情報を明らかにする真偽の質問をする可能性があります。

SQL インジェクション攻撃を防御する方法

1.準備済みステートメント (パラメーター化されたクエリ) を使用する

SQL インジェクションに対する最も効果的な防御策は、パラメータ化されたクエリでプリペアド ステートメントを使用することです。これにより、ユーザー入力が実行可能コードではなくデータとして扱われることが保証されます。

MySQL を使用した Python の例 (MySQLdb ライブラリを使用):

SELECT * FROM users WHERE username = 'admin' AND password = 'password123';
ログイン後にコピー
ログイン後にコピー

この例では、%s はユーザー入力のプレースホルダーであり、MySQL は特殊文字を自動的にエスケープするため、攻撃者が悪意のある SQL を挿入できなくなります。

2. ORM (オブジェクト リレーショナル マッピング) フレームワークを使用する

多くの Web 開発フレームワーク (Django、Flask など) は、データベースと対話するための ORM レイヤーを提供します。 ORM は安全な SQL クエリを生成し、ユーザー入力を自動的にエスケープすることで SQL インジェクションを防ぎます。

たとえば、Django の ORM を使用する場合:

' OR 1=1; --
ログイン後にコピー
ログイン後にコピー

Django の ORM が入力のサニタイズを処理するため、このクエリは SQL インジェクションから安全です。

3.入力の検証とサニタイズ

  • ホワイトリスト入力: 特にユーザー名やパスワードなどのフィールドでは、予期される入力のみを許可します。たとえば、ユーザー名には英数字のみを使用できます。
  • 入力のエスケープ: SQL クエリを動的に構築する必要がある場合 (これは推奨されません)、適切なエスケープ関数を使用して特殊文字を必ずエスケープしてください。
  • 正規表現を使用する: ユーザー入力が処理する前に、予想されるパターンと一致することを確認します。

4. Web アプリケーション ファイアウォール (WAF) を採用する

WAF は、受信 HTTP リクエストを検査し、悪意のあるペイロードをフィルタリングして除外することで、悪意のある SQL インジェクションの試みをリアルタイムでブロックできます。人気のある WAF には次のようなものがあります:

  • ModSecurity: Apache、Nginx、および IIS 用のオープンソース WAF。
  • Cloudflare: SQL インジェクションやその他の攻撃に対する保護機能を備えた使いやすい WAF を提供します。

5.データベースアカウントに最小権限を使用する

アプリケーションで使用されるデータベース アカウントに最小限の権限があることを確認してください。例:

  • アプリケーションのデータベース ユーザーには、テーブルを削除または変更する権限がありません。
  • 読み取り専用操作と書き込み操作には異なるアカウントを使用します。

6.エラー処理とログ

  • データベース エラーを公開しない: 機密情報を公開せずにデータベース エラーを適切に処理するようにアプリケーションを構成します。たとえば、詳細なエラー メッセージをエンド ユーザーに表示することは避けてください。
  • ログを有効にする: 後で分析できるように、不審なアクティビティと SQL インジェクションの脆弱性を悪用しようとする試みをログに記録します。

SQL インジェクション防止チェックリスト

  1. パラメータ化されたクエリでは常に 準備されたステートメント を使用してください。
  2. ORM フレームワークを使用してデータベースと対話します。
  3. サニタイズとユーザー入力の検証 (ホワイトリスト、正規表現など)。
  4. Web アプリケーション ファイアウォール (WAF) を実装します。
  5. データベース アカウントには最小権限の原則に従います。
  6. コード内での SQL の直接実行は可能な限り避けてください
  7. データベースの機密情報の公開を避けるために、エラー処理メカニズムを使用してください。
  8. 定期的なセキュリティテストを実施して脆弱性を特定します。

結論

SQL インジェクションは、現在でも最も蔓延しているセキュリティ脅威の 1 つですが、プリペアド ステートメント、入力検証、ORM フレームワークの使用などの適切な防御手段を採用することで、SQL インジェクション攻撃のリスクを大幅に軽減できます。あなたのアプリケーション。さらに、アプリケーションの SQL 脆弱性を定期的にテストし、ベスト プラクティスを適用することは、システムを保護し、機密のユーザー データを保護するのに役立ちます。

積極的に意識を保つことで、SQL インジェクション攻撃による壊滅的な結果を防ぎ、アプリケーションのセキュリティを確保できます。

~トリセック

以上がSQL インジェクション攻撃を検出して防御する方法 (一部必読)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート