php_PHP チュートリアルで SQL インジェクションを防ぐ方法

WBOY
リリース: 2016-07-13 17:10:56
オリジナル
853 人が閲覧しました

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 ディレクトリを指定してください:

コードは次のとおりですコードをコピー

(4) セーフモードでファイルを含める

一部のパブリック ファイルをセーフ モードに含める場合は、オプションを変更します:

safe_mode_exec_dir = D:/usr/www

コードは次のとおりです コードをコピー

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.comtru​​ehttp://www.bkjia.com/PHPjc/629642.html技術記事 SQL インジェクションにはデータベースの操作が必要なため、通常は SQL ステートメントのキーワード (挿入、削除、更新、選択、渡された変数パラメーターがユーザー制御可能かどうか、およびそれらが安全に実行されたかどうかを確認する) を検索します。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート