SQL インジェクションはデータベースの操作を必要とするため、通常、SQL ステートメントのキーワード (挿入、削除、更新、選択) を検索し、渡された変数パラメーターがユーザー制御可能であるかどうか、およびセキュリティ処理が行われているかどうかを確認します
SQL インジェクションの仕組み
データベース クエリの構築は非常に簡単なプロセスです。通常、これは次の方針に沿って実装されます。問題を説明するために、
があると仮定します。ワインデータベーステーブル「wines」、そのうちの 1 つは「品種」(つまり、ワインの種類):
1. フォームを提供する - ユーザーが検索対象を送信できるようにします。ユーザーがタイプ「ラグレイン」のワインを検索することを選択したと仮定します。
2. 次のように変数に代入して、ユーザーの検索語を取得して保存します。
コードをコピー | |
$品種 = $_POST['品種'];
|
ラグレイン
3. 次に、変数を使用して WHERE 句でデータベース クエリを構築します。
コードをコピー | |
|
コードをコピー | |
|
5. MySQL は wines テーブル内のすべてのレコードを返します。その中で、フィールドの多様性の値は「lagrein」です。
今では、これはおなじみの非常に簡単なプロセスになっているはずです。残念ながら、私たちが慣れ親しんでいるプロセスが簡単な場合もあります
私たちを自己満足に導きます。次に、作成したクエリを再分析してみましょう。
1. 作成するクエリの固定部分は、変数値の始まりを説明するために使用する単一引用符で終わります。
コードは次のとおりです
| 2. 元の固定部分を使用し、ユーザーが送信した変数の値を含めます:
コードは次のとおりです
| 3. 次に、変数値の終わりを表す別の一重引用符を使用してこの結果を連結します。
コードは次のとおりです
$ クエリ .= ""; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
したがって、$query の値は次のようになります:
この構成が成功するかどうかは、ユーザーの入力にかかっています。この例では、単一の単語 (場合によっては単語のグループ) を使用してワインの種類を指定しています。 したがって、クエリは問題なく構築され、結果は期待どおり、ワインの種類が「ラグレイン」であるワインのリストになります。さあ ここで、単純なワインの種類「ラグレイン」を入力する代わりに、ユーザーが次のように入力すると想像してみましょう (パッケージに注意してください )2 つの句読点を含む):
ここで、以前に修正した部分を使用してクエリの構築を続けます (ここでは、$query 変数の結果値のみを示します)。
上記のデータを受け入れると、マルウェア、クロスサイト攻撃、SQL インジェクションの待機を防ぐことができます 以下はサーバー側のセキュリティ設定の概要です
php のセーフ モードは、system()、 などの php の一部の関数を制御できる非常に重要な組み込みセキュリティ メカニズムです。同時に、多くのファイル操作関数の権限が制御され、/etc/passwd などの特定の重要なファイルが許可されません。 ただし、デフォルトの php.ini ではセーフ モードが開かないので、セーフ モードを開いてみましょう:セーフモード = オン (2) ユーザーグループのセキュリティ safe_mode がオンになり、safe_mode_gid がオフになった場合、PHP スクリプトはファイルにアクセスできますが、それは同じです グループのユーザーもファイルにアクセスできます。 推奨設定: safe_mode_gid = オフ これを設定しない場合、サーバー Web サイトのディレクトリ内のファイルを操作できない可能性があります。たとえば、 ファイルを操作するとき。 (3) プログラムのホームディレクトリをセーフモードで実行 セーフ モードがオンになっているが、特定のプログラムを実行したい場合は、実行するプログラムのホーム ディレクトリを指定できます:
次に、実行する必要があるプログラムをコピーします。例えば:
実際、通常、php スクリプトに含まれるファイルはプログラム自体に記述されており、特定のニーズに応じて設定できます。 (5) PHPスクリプトがアクセスできるディレクトリを制御する open_basedir オプションを使用して、指定されたディレクトリにのみアクセスするように PHP スクリプトを制御し、PHP スクリプトへのアクセスを回避できます アクセスすべきではないファイルにより、phpshell の害はある程度制限され、通常は Web サイトのディレクトリのみにアクセスするように設定できます。
セーフモードがオンになっている場合、機能の禁止は必要ありませんが、安全性を考慮しております。たとえば、 コマンドを実行したり、php情報を表示したりできるsystem()を含むphp関数を実行する必要はないと考えています phpinfo() およびその他の関数を禁止できます:
上記の実行コマンド関数をこの関数と組み合わせることもできます。 ほとんどの phpshell に耐えることができます。(7) httpヘッダー内のPHPバージョン情報の漏洩を遮断する ハッカーがサーバー内の PHP バージョン情報を取得できないようにするために、http ヘッダーの情報をオフにすることができます:
(8) グローバル変数の登録を閉じる PHP で送信された変数 (POST または GET を使用して送信された変数を含む) は、グローバル変数として自動的に登録され、直接アクセスできます。 これはサーバーにとって非常に安全ではないため、グローバル変数として登録させることはできません。そのため、グローバル変数の登録オプションをオフにします。
コードは次のとおりです
エラー メッセージには php スクリプトが含まれます。 前のパス情報やクエリ SQL ステートメントやその他の情報は、この種の情報がハッカーに提供された後は安全ではないため、通常はサーバーでエラー プロンプトを無効にすることをお勧めします。
コードは次のとおりです
コードは次のとおりです
サーバーが実行されている理由を見つけるために、display_errors をオフにした後、エラー情報を記録することをお勧めします。
コードは次のとおりです
コードをコピー
|