SQL インジェクションはデータベースの操作を必要とするため、通常、SQL ステートメントのキーワード (挿入、削除、更新、選択) を検索し、渡された変数パラメーターがユーザー制御可能であるかどうか、およびセキュリティ処理が行われているかどうかを確認します
SQL インジェクションの仕組み
データベース クエリの構築は非常に簡単なプロセスです。通常、これは次の方針に沿って実装されます。問題を説明するために、
があると仮定します。
ワインデータベーステーブル「wines」、そのうちの 1 つは「品種」(つまり、ワインの種類):
1. フォームを提供する - ユーザーが検索対象を送信できるようにします。ユーザーがタイプ「ラグレイン」のワインを検索することを選択したと仮定します。
2. 次のように変数に代入して、ユーザーの検索語を取得して保存します。
コードは次のとおりです
| コードをコピー
|
$品種 = $_POST['品種'];
|
したがって、変数 $variety の値は次のようになります:
ラグレイン
3. 次に、変数を使用して WHERE 句でデータベース クエリを構築します。
コードは次のとおりです
コードをコピー |
|
$query = “SELECT * FROM ワイン WHERE 品種=’$品種’”;
|
変数 $query の値は次のようになります:
コードは次のとおりです
コードをコピー |
|
品種=’ラグレイン’のワインから * 選択してください
|
4. MySQL サーバーにクエリを送信します。
5. MySQL は wines テーブル内のすべてのレコードを返します。その中で、フィールドの多様性の値は「lagrein」です。
今では、これはおなじみの非常に簡単なプロセスになっているはずです。残念ながら、私たちが慣れ親しんでいるプロセスが簡単な場合もあります
私たちを自己満足に導きます。次に、作成したクエリを再分析してみましょう。
1. 作成するクエリの固定部分は、変数値の始まりを説明するために使用する単一引用符で終わります。
コードは次のとおりです
コードをコピー
|
|
$query = ” SELECT * FROM ワイン WHERE 品種 = ‘”;
| 2. 元の固定部分を使用し、ユーザーが送信した変数の値を含めます:
コードは次のとおりです
コードをコピー
|
|
$クエリ .= $variety;
| 3. 次に、変数値の終わりを表す別の一重引用符を使用してこの結果を連結します。
コードは次のとおりです
コードをコピー
|
| $ クエリ .= "";
したがって、$query の値は次のようになります:
コードは次のとおりです |
コードをコピー |
品種 = 「ラグレイン」のワインから * 選択してください
|
この構成が成功するかどうかは、ユーザーの入力にかかっています。この例では、単一の単語 (場合によっては単語のグループ) を使用してワインの種類を指定しています。
したがって、クエリは問題なく構築され、結果は期待どおり、ワインの種類が「ラグレイン」であるワインのリストになります。さあ
ここで、単純なワインの種類「ラグレイン」を入力する代わりに、ユーザーが次のように入力すると想像してみましょう (パッケージに注意してください )
2 つの句読点を含む):
コードは次のとおりです |
コードをコピー |
ラグレイン、または 1=1;
|
ここで、以前に修正した部分を使用してクエリの構築を続けます (ここでは、$query 変数の結果値のみを示します)。
コードは次のとおりです
| コードをコピー
|
品種 = ‘ のワインから * 選択してください
|
次に、ユーザー入力 (ここでは太字で表示) を含む変数の値を使用してそれに接続します。
コードは次のとおりです
コードをコピー |
|
品種 = 「ラグレイン」または 1=1 のワインから * 選択してください;
|
最後に、上下に引用符を追加します:
コードは次のとおりです
コードをコピー |
|
品種 = 'ラグレイン' または 1=1;' のワインから * を選択してください
|
上記の問題を防ぐ関数を書くことで、これらの問題を要約できます。
コードは次のとおりです |
コードをコピー |
/**
+------------------------------------------------ ----------
* アンチホース、アンチクロスサイト攻撃、アンチ SQL インジェクション機能
+------------------------------------------------ ----------
*$date によって渡されるパラメータは、$ignore_magic_quotes 変数のマジック参照である必要があります
+------------------------------------------------ ---------- */
関数 in($data,$ignore_magic_quotes=false)
{
if(is_string($data))
{
$data=trim(htmlspecialchars($data));//ハッキングやクロスサイト攻撃を防ぐ
if(($ignore_magic_quotes==true)||(!get_magic_quotes_gpc()))
{
$data = addedlashes($data);// SQL インジェクションを防止します
}
$data を返します;
}
else if(is_array($data))//配列の場合は、再帰的フィルタリングを使用します
{
foreach($data as $key=>$value)
{
$data[$key]=in($value);
}
$data を返します;
}
それ以外は
{
$data を返します;
}
}
|
上記のデータを受け入れると、マルウェア、クロスサイト攻撃、SQL インジェクションの待機を防ぐことができます
以下はサーバー側のセキュリティ設定の概要です
(1)php のセーフモードをオンにする
php のセーフ モードは、system()、 などの php の一部の関数を制御できる非常に重要な組み込みセキュリティ メカニズムです。
同時に、多くのファイル操作関数の権限が制御され、/etc/passwd などの特定の重要なファイルが許可されません。
ただし、デフォルトの php.ini ではセーフ モードが開かないので、セーフ モードを開いてみましょう:
セーフモード = オン
(2) ユーザーグループのセキュリティ
safe_mode がオンになり、safe_mode_gid がオフになった場合、PHP スクリプトはファイルにアクセスできますが、それは同じです
グループのユーザーもファイルにアクセスできます。
推奨設定:
safe_mode_gid = オフ
これを設定しない場合、サーバー Web サイトのディレクトリ内のファイルを操作できない可能性があります。たとえば、
ファイルを操作するとき。
(3) プログラムのホームディレクトリをセーフモードで実行
セーフ モードがオンになっているが、特定のプログラムを実行したい場合は、実行するプログラムのホーム ディレクトリを指定できます:
コードは次のとおりです
| コードをコピー
|
safe_mode_exec_dir = D:/usr/bin
|
通常、プログラムを実行する必要はないため、システム プログラム ディレクトリを実行しないことをお勧めします。
次に、実行する必要があるプログラムをコピーします。例えば:
コードは次のとおりです
| コードをコピー
|
safe_mode_exec_dir = D:/tmp/cmd
|
ただし、プログラムを実行しないことをお勧めします。その場合は、Web ディレクトリを指定してください:
コードは次のとおりです
| コードをコピー
|
safe_mode_exec_dir = D:/usr/www
|
(4) セーフモードでファイルを含める
一部のパブリック ファイルをセーフ モードに含める場合は、オプションを変更します:
コードは次のとおりです |
コードをコピー |
safe_mode_include_dir = D:/usr/www/include/
|
実際、通常、php スクリプトに含まれるファイルはプログラム自体に記述されており、特定のニーズに応じて設定できます。
(5) PHPスクリプトがアクセスできるディレクトリを制御する
open_basedir オプションを使用して、指定されたディレクトリにのみアクセスするように PHP スクリプトを制御し、PHP スクリプトへのアクセスを回避できます
アクセスすべきではないファイルにより、phpshell の害はある程度制限され、通常は Web サイトのディレクトリのみにアクセスするように設定できます。
コードは次のとおりです
| コードをコピー
|
open_basedir = D:/usr/www
|
(6)危険な機能をオフにする
セーフモードがオンになっている場合、機能の禁止は必要ありませんが、安全性を考慮しております。たとえば、
コマンドを実行したり、php情報を表示したりできるsystem()を含むphp関数を実行する必要はないと考えています
phpinfo() およびその他の関数を禁止できます:
コードは次のとおりです
| コードをコピー
|
disable_functions = システム、パススルー、exec、shell_exec、popen、phpinfo
|
ファイルやディレクトリの操作を禁止したい場合は、多くのファイル操作を閉じることができます
コードは次のとおりです
| コードをコピー
|
disable_functions = chdir、chroot、dir、getcwd、opendir、readdir、scandir、fopen、リンク解除、削除、コピー、mkdir、
rmdir、名前変更、ファイル、file_get_contents、fputs、fwrite、chgrp、chmod、chown
|
上記は、一般的に使用されるファイル処理関数の一部を示したものにすぎません。 上記の実行コマンド関数をこの関数と組み合わせることもできます。
ほとんどの phpshell に耐えることができます。
(7) httpヘッダー内のPHPバージョン情報の漏洩を遮断する
ハッカーがサーバー内の PHP バージョン情報を取得できないようにするために、http ヘッダーの情報をオフにすることができます:
コードは次のとおりです
| コードをコピー
|
expose_php = オフ
|
たとえば、ハッカーが www.12345.com 80 に Telnet した場合、PHP 情報を見ることはできません。
(8) グローバル変数の登録を閉じる
PHP で送信された変数 (POST または GET を使用して送信された変数を含む) は、グローバル変数として自動的に登録され、直接アクセスできます。
これはサーバーにとって非常に安全ではないため、グローバル変数として登録させることはできません。そのため、グローバル変数の登録オプションをオフにします。
コードは次のとおりです
コードをコピー |
|
register_globals = オフ
|
もちろん、これが設定されている場合は、GET によって送信された変数 var を取得するなど、適切な方法を使用して対応する変数を取得する必要があります。
その後、それを取得するには $_GET['var'] を使用する必要があります。PHP プログラマはこれに注意する必要があります。
(9) SQL インジェクションを防ぐために、magic_quotes_gpc をオンにします
SQL インジェクションは、Web サイトのバックエンドに侵入したり、サーバー全体がダウンしたりする可能性がある非常に危険な問題です。
だから気をつけてね。 php.ini に次の設定があります:
コードは次のとおりです
コードをコピー |
|
magic_quotes_gpc = オフ
|
これはデフォルトではオフになっています。オンにすると、ユーザーが送信した SQL クエリが自動的に変換されます。
たとえば、「 を 」に変換するなど。これは SQL インジェクションを防ぐ上で重要な役割を果たします。したがって、次のように設定することをお勧めします:
コードは次のとおりです
コードをコピー
|
|
magic_quotes_gpc = オン
| (10) エラーメッセージ制御
通常、php はデータベースに接続されていない場合、またはその他の状況下でエラーを表示します。 エラー メッセージには php スクリプトが含まれます。
前のパス情報やクエリ SQL ステートメントやその他の情報は、この種の情報がハッカーに提供された後は安全ではないため、通常はサーバーでエラー プロンプトを無効にすることをお勧めします。
コードは次のとおりです
コードをコピー
|
|
display_errors = オフ
| エラー情報を表示したい場合は、エラー表示のレベルを必ず設定してください。たとえば、警告以上の情報のみを表示します:
コードは次のとおりです
コードをコピー
|
|
error_reporting = E_WARNING & E_ERROR
| もちろん、エラープロンプトをオフにすることをお勧めします。
(11) エラーログ
サーバーが実行されている理由を見つけるために、display_errors をオフにした後、エラー情報を記録することをお勧めします。
コードは次のとおりです
コードをコピー
|
| log_errors = オン
同時に、エラー ログを保存するディレクトリも設定する必要があります。ルート Apache ログも一緒に保存することをお勧めします。
|
コードは次のとおりです
コードをコピー
|
error_log = D:/usr/local/apache2/logs/php_error.log |
注: このファイルでは、Apache ユーザーとグループに書き込み権限を与える必要があります。
MYSQL の権限を削減した操作
mysqlstart などの新しいユーザーを作成します
コードは次のとおりです |
コードをコピー |
ネット ユーザー mysqlstart は Microsoft /add
ネットローカルグループユーザーmysqlstart /del
|
どのグループにも属していません
MYSQL が d:mysql にインストールされている場合は、mysqlstart にフルコントロール権限を与えます
次に、システム サービスで MYSQL サービス プロパティを設定し、ログイン プロパティでこのユーザー mysqlstart を選択し、パスワードを入力して確認します。
MYSQL サービスを再起動すると、MYSQL は低い権限で実行されます。
Apache が Windos プラットフォーム上に構築されている場合、Apache はデフォルトでシステム権限で実行されることに注意する必要があります。
これは恐ろしいことです。これは人々を非常に不快にさせます。それなら、Apache の権限を下げましょう。
コードは次のとおりです |
コードをコピー |
ネット ユーザー Apache クソマイクロソフト /add
ネットローカルグループユーザー apache /del
|
わかりました。どのグループにも属さないユーザー apche を作成しました。
コンピューターマネージャーを開き、サービスを選択し、Apacheサービスのプロパティをクリックし、ログオンを選択し、このアカウントを選択し、上で作成した設定を入力します
アカウントとパスワード、
Apache サービスを再起動します。Apache は低い権限で実行されています。
実際、Apache ユーザーが実行したいことだけを実行できるように各フォルダーの権限を設定し、各ディレクトリを作成することもできます
読み取りと書き込みができる単一のユーザー
この記事では、プログラムからデータベース、最終的な WEB サーバーの構成まですべてを説明します。この記事を参照すると、より安全になります。
それを達成する方法はありません。
|
http://www.bkjia.com/PHPjc/629642.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/629642.html技術記事 SQL インジェクションにはデータベースの操作が必要なため、通常は SQL ステートメントのキーワード (挿入、削除、更新、選択、渡された変数パラメーターがユーザー制御可能かどうか、およびそれらが安全に実行されたかどうかを確認する) を検索します。
|