1. SQLインジェクションの概要SQL インジェクションは、最も一般的なネットワーク攻撃方法の 1 つです。攻撃を実行するためにオペレーティング システムのバグを使用するのではなく、プログラムを作成する際のプログラマーの不注意をターゲットにします。SQL ステートメントを使用してアカウントレス ログインを実行し、データベースを改ざんすることさえあります。 2. 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インジェクションを防ぐ方法
1. 変数のデータ型と形式を確認するSQL 文が where id={$id} の形式で、データベース内のすべての ID が数値である場合は、SQL を実行する前に変数 id が int 型であることを確認する必要があります。電子メールを受信する場合は、変数が電子メール アドレスの形式になっていることを確認して厳密に確認する必要があります。日付、時刻などの他の型についても同様です。まとめると、固定形式の変数がある限り、SQL ステートメントを実行する前に固定形式に従って厳密にチェックし、変数が期待どおりの形式であることを確認する必要があります。これにより、SQL インジェクション攻撃を大幅に回避できます。 たとえば、ユーザー名パラメータを受け入れるという前の例では、製品設計では、ユーザー登録の開始時に、5〜20 文字で大文字と小文字、数字、一部の安全な記号のみで構成され、特殊文字は使用できないなどのユーザー名ルールを設定する必要があります。この時点で、統一されたチェックを実行するための check_username 関数が必要になります。ただし、記事公開システムやコメント システムなど、ユーザーが任意の文字列を送信できるようにする必要があるシステムなど、このルールには多くの例外が存在します。この場合は、フィルタリングなどの他のソリューションを使用する必要があります。 2. 特殊記号をフィルタリングする固定形式で決定できない変数の場合、特殊記号をフィルタリングするかエスケープする必要があります。 3. 変数をバインドし、プリコンパイルされたステートメントを使用するMySQL の mysqli ドライバーは、準備済みステートメントのサポートを提供します。さまざまなプログラミング言語には、準備済みステートメントを使用するための独自の方法があります。 実際、プリコンパイルされたステートメントを使用して変数をバインドすることが、SQL インジェクションを防ぐ最善の方法です。プリコンパイルされた SQL ステートメントのセマンティクスは変更されません。SQL ステートメントでは、変数は疑問符で表されます。ハッカーが非常に熟練していても、SQL ステートメントの構造を変更することはできません。 まとめ:
一般的に、一般的な SQL インジェクションを防ぐには、コード標準に注意するだけで十分です。 以上、Web プロジェクトにおける SQL インジェクションの防止についてご紹介しました。お役に立てれば幸いです。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
>>: HTML タグのメタ概要、HTML5 のヘッド メタ属性の概要
序文この記事は Meituan の大物によって書かれました。とても素晴らしいので、皆さんと共有したい...
Dockerの概要Docker はオープンソースのソフトウェア展開ソリューションです。 Docker...
1. まず、Springbootを使用して簡単なDubboテストプログラムを構築し、関連する依存関係...
目次chmod例権限に関する特別な注意分析するチョーンchgrp umask Linux オペレーテ...
目次構造継承(callで実装)プロトタイプチェーン継承(プロトタイプチェーンの助けを借りて実装)複合...
目次1. 初期SQLの準備2.MysqlはSQL文の実行時間をチェックします3. さまざまなクエリの...
目次プロセスコミュニケーションプロセス間の双方向通信問題要約するサードパーティのデータ サプライヤー...
序文場合によっては、次の図のような浮動効果の要件が必要になります。 成し遂げる標準的な通常の状況では...
1. 問題の紹介ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、...
MySQL 5.x と MySQL 8.0.X のいくつかの違いapplication.proper...
WeChatアプレット:シンプルな計算機、参考までに、具体的な内容は次のとおりです。ミニプログラムに...
目次MySQL 8 の WITH クエリについて学ぶ1. 例3. 練習するMySQL 8 の WIT...
用語: 1. VM: 仮想マシンステップ: 1. Windows 10 に VirtualBox 6...
表ラベルの構成HTML 内の表は <table> タグで構成されており、ブラウザはタグを...
機能シナリオを簡単に説明しましょう。データ行フィールドは次のとおりです。名前開始日時タイプこの表では...