Web プロジェクトでの SQL インジェクションの防止

Web プロジェクトでの SQL インジェクションの防止

1. SQLインジェクションの概要

SQL インジェクションは、最も一般的なネットワーク攻撃方法の 1 つです。攻撃を実行するためにオペレーティング システムのバグを使用するのではなく、プログラムを作成する際のプログラマーの不注意をターゲットにします。SQL ステートメントを使用してアカウントレス ログインを実行し、データベースを改ざんすることさえあります。

2. SQLインジェクション攻撃の全体的な考え方

  • 1. SQLインジェクションの場所を見つける
  • 2. サーバータイプとバックエンドデータベースタイプを決定する
  • 3. 異なるサーバーとデータベースの特性に基づくSQLインジェクション攻撃

SQLインジェクション攻撃の例

たとえば、ログイン インターフェイスでは、ユーザー名とパスワードの入力を求められます。

アカウントなしでログインするには、次のように入力します:

ユーザー名: 'または1 = 1 –

パスワード:

ログインをクリックします。特別な処理を行わない場合、不正ユーザーは簡単にログインできてしまいます。(もちろん、一部の言語のデータベース API では、すでにこれらの問題に対処しています。)

これはなぜでしょうか? 以下で分析してみましょう:

理論的には、バックグラウンド認証プログラムには次の SQL ステートメントが含まれます。

文字列 sql = "user_table から * を選択します。ユーザー名 =
' "+userName+" ' および password=' "+password+" '";

上記のユーザー名とパスワードを入力すると、上記の SQL ステートメントは次のようになります。
SELECT * FROM user_table WHERE username=
''または 1 = 1 -- およびパスワード =''

「」
SQL ステートメントを分析します。
条件の後に username=”or 1=1 username is equal to” または 1=1 が続く場合、この条件は確実に成功します。

そして、最後にコメントを意味する - を 2 つ追加します。これにより、後続のステートメントがコメント化され、無効になります。このようにして、ステートメントは常に正しく実行され、ユーザーは簡単にシステムを欺いて合法的な ID を取得できます。
これはまだ比較的穏やかです。SELECT * FROM user_table WHEREを実行すると
ユーザー名='';DROP DATABASE (DB 名) --' およびパスワード=''
結果は想像に難くありません...
「」

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

注: SQL インジェクションの脆弱性を持つプログラムは、クライアント ユーザーが入力した変数または URL によって渡されたパラメータを受け入れる必要があり、この変数またはパラメータが SQL ステートメントの一部であるためです。

ユーザーが入力した内容や渡されたパラメータには常に注意を払う必要があります。これはセキュリティ分野における「外部データは信用できない」という原則です。Webセキュリティ分野におけるさまざまな攻撃方法を見ると、

それらのほとんどは、開発者がこの原則に違反していることが原因であるため、変数の検出、フィルタリング、検証から始めて、変数が開発者の期待どおりであることを確認することが自然な方法です。

1. 変数のデータ型と形式を確認する

SQL 文が where id={$id} の形式で、データベース内のすべての ID が数値である場合は、SQL を実行する前に変数 id が int 型であることを確認する必要があります。電子メールを受信する場合は、変数が電子メール アドレスの形式になっていることを確認して厳密に確認する必要があります。日付、時刻などの他の型についても同様です。まとめると、固定形式の変数がある限り、SQL ステートメントを実行する前に固定形式に従って厳密にチェックし、変数が期待どおりの形式であることを確認する必要があります。これにより、SQL インジェクション攻撃を大幅に回避できます。

たとえば、ユーザー名パラメータを受け入れるという前の例では、製品設計では、ユーザー登録の開始時に、5〜20 文字で大文字と小文字、数字、一部の安全な記号のみで構成され、特殊文字は使用できないなどのユーザー名ルールを設定する必要があります。この時点で、統一されたチェックを実行するための check_username 関数が必要になります。ただし、記事公開システムやコメント システムなど、ユーザーが任意の文字列を送信できるようにする必要があるシステムなど、このルールには多くの例外が存在します。この場合は、フィルタリングなどの他のソリューションを使用する必要があります。

2. 特殊記号をフィルタリングする

固定形式で決定できない変数の場合、特殊記号をフィルタリングするかエスケープする必要があります。

3. 変数をバインドし、プリコンパイルされたステートメントを使用する

MySQL の mysqli ドライバーは、準備済みステートメントのサポートを提供します。さまざまなプログラミング言語には、準備済みステートメントを使用するための独自の方法があります。

実際、プリコンパイルされたステートメントを使用して変数をバインドすることが、SQL インジェクションを防ぐ最善の方法です。プリコンパイルされた SQL ステートメントのセマンティクスは変更されません。SQL ステートメントでは、変数は疑問符で表されます。ハッカーが非常に熟練していても、SQL ステートメントの構造を変更することはできません。

まとめ:

  • 1. バインド変数を含むプリコンパイルされたSQL文を使用する
  • 2. ユーザーの機密情報を厳重に暗号化する
  • 3. 本番環境でWebサーバーのエラー表示を勝手に有効にしない
  • 4. 正規表現を使用して受信パラメータをフィルタリングする
  • 5. 文字列フィルタリング
  • 6. 不正な文字が含まれていないか確認する

一般的に、一般的な SQL インジェクションを防ぐには、コード標準に注意するだけで十分です。

以上、Web プロジェクトにおける SQL インジェクションの防止についてご紹介しました。お役に立てれば幸いです。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • SQLインジェクションを防ぐ効果的な5つの方法のまとめ
  • SQLインジェクションを効果的に防ぐ方法
  • SQLインジェクションを防ぐための効果的な方法のデモンストレーション
  • #{} が SQL インジェクションを防ぐ理由について簡単に説明します。

<<:  Javascriptの基本ループの詳しい説明

>>:  HTML タグのメタ概要、HTML5 のヘッド メタ属性の概要

推薦する

テキストエリアのテキスト入力領域に改行を実装する方法

textarea 入力領域でテキストを折り返す場合は、<br/> と入力すると <...

JS でクリップボード API を使用する方法

目次1. Document.execCommand() メソッド(1)コピー操作(2)貼り付け操作(...

VmWareでcentos7をインストールするときにインターネットにアクセスできない問題の解決策

Centos7 のインストール時に VmWare がインターネットにアクセスできない場合はどうすれば...

Dockerはredis 5.0.7をインストールし、外部構成とデータの問題をマウントします

Redis は、ANSI C で記述されたオープンソースの NoSQL データベースであり、ネットワ...

今日、私は非常に奇妙なクリックの問題に遭遇し、自分で解決しました

...こんな感じで、今日はポップアップウィンドウを作ろうと思ったのですが、バックエンド PHP によ...

Linux システムで .sh ファイルを実行する方法

Linux システムで .sh ファイルを実行する方法は 2 つあります。たとえば、ルート ディレク...

Linux におけるゼロコピー技術の使用に関する簡単な分析

この記事では、Linux におけるいくつかの主要なゼロコピー テクノロジと、ゼロコピー テクノロジを...

24 の実用的な JavaScript 開発のヒント

目次1.配列を初期化する2. 配列の合計、最大値、最小値3. エラー値をフィルタリングする4. 論理...

Linux で pip 操作中にタイムアウトが発生する問題を解決する方法

Linuxインスタンスでpipを使用する際のタイムアウト問題を解決する方法pip は最も人気のある ...

div の高さをブラウザの高さに合わせて調整する方法

この古くからある疑問は、数え切れないほどのフロントエンド開発者やバックエンドプログラマーを悩ませてき...

Tomcat と WebLogic で純粋な HTML ファイルを展開するプロセスの分析

1. まず、純粋なHTMLファイルにはindex.htmlというエントリが必要です。 2. Tomc...

Node.js は、異なるリクエストパスに応じて異なるデータを返します。

目次1. 異なるリクエストパスに応じて異なるデータを返す方法を学びます。 2. 送信データ: データ...

Dockerイメージのサイズを縮小する6つの方法

2017 年に Vulhub に取り組み始めてから、私は厄介な問題に悩まされてきました。Docker...

mysqladmin を使用して MySQL インスタンスの現在の TPS と QPS を取得する方法

mysqladmin は管理と操作を行う公式の mysql クライアント プログラムです。MySQL...

MySQL における distinct と group by の違い

簡単に言うと、distinct は重複を削除するために使用され、group by は統計を集計するよ...