ホームページ > php教程 > php手册 > PHPでSQLインジェクションを防ぐ方法

PHPでSQLインジェクションを防ぐ方法

WBOY
リリース: 2016-11-16 10:24:03
オリジナル
1295 人が閲覧しました

【1.サーバー側の設定】

安全性、PHP コードの作成は 1 つの側面であり、PHP 構成は非常に重要です。

PHP を手動でインストールしました。PHP のデフォルト設定ファイルは /usr/local/apache2/conf/php.ini にあります。これにより、PHP をさらに実行できるように php.ini の内容を設定することになります。無事に。 PHP全体のセキュリティ設定は主にphpshellとSQLインジェクションによる攻撃を防ぐためのものです。ゆっくり説明していきます。まず、編集ツールを使用して /etc/local/apache2/conf/php.ini を開きます。他の方法でインストールした場合は、設定ファイルがこのディレクトリにない可能性があります。

(1) phpのセーフモードをオンにする

phpのセーフモードは、system()、

ファイル操作関数など、phpの一部の関数を制御できる非常に重要な組み込みのセキュリティメカニズムです権限制御を実行し、/etc/passwd、

などの特定のキーファイルを許可しません。しかし、デフォルトのphp.iniはセーフモードを開かないので、それを開きます:

safe_mode = on

( 2) ユーザーグループのセキュリティ

safe_modeがオン、safe_mode_gidがオフの場合、PHPスクリプトはファイルにアクセスでき、同じ

グループ内のユーザーもファイルアクセスにアクセスできます。

次のように設定することをお勧めします:

safe_mode_gid = off

これを設定しないと、当社のサーバー 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) 危険な機能をオフにする

セーフモードがオンになっている場合、機能の禁止は必要ありませんが、安全性を考慮しております。たとえば、

コマンドを実行できるsystem()を含むphp関数や、

phpinfo()やphp情報を表示できるその他の関数を実行したくない場合は、それらを禁止できます。

disable_functions = system,passthru,exec,shell_exec,popen,phpinfo

ファイルやディレクトリの操作を禁止したい場合は、多くのファイル操作を無効にすることができます

disable_functions = chdir,chroot,dir 、getcwd、opendir、readdir、scandir、fopen、リンク解除、削除、コピー、mkdir、rmdir、名前変更、file、file_get_contents、fputs、fwrite、chgrp、chmod、chown
上記は、一般的に使用されるファイル処理関数の一部のみをリストしたものです。また、上記の実行コマンド関数とこの関数

を組み合わせて、ほとんどの phpshell に耐えることもできます。

(7) httpヘッダーのPHPバージョン情報の漏洩をオフにする

ハッカーがサーバー内のPHPバージョン情報を取得するのを防ぐために、httpヘッダーのPHPバージョン情報の漏洩をオフにすることができます。 header:

expose_php = Off

たとえば、ハッカーが www.12345.com 80 に Telnet した場合、PHP 情報を見ることはできません。

(8) グローバル変数の登録をオフにする

POST または GET を使用して送信された変数を含む、PHP で送信された変数は、グローバル変数として自動的に登録され、直接アクセスできます。

これは正解ですサーバーは非常に安全ではないため、グローバル変数として登録させることはできません。そのため、グローバル変数の登録オプションをオフにします:

register_globals = Off

もちろん、次のように設定されている場合は、 , 次に、対応する変数を取得するときは、GET によって送信された変数 var を取得するなど、合理的な方法を使用します。

その後、$_GET['var'] を使用して取得します。PHP プログラマはこれに注意する必要があります。

(9) SQL インジェクションを防ぐために、magic_quotes_gpc をオンにします

SQL インジェクションは、小さい場合には Web サイトのバックエンドに侵入され、深刻な場合にはサーバー全体が崩壊する非常に危険な問題です

。ので注意してください。 php.ini には次の設定があります:

magic_quotes_gpc = Off

これがオンになっている場合、ユーザーが送信した SQL クエリが自動的に変換されます。例えば、

。 ' を ' に変換します。これは SQL インジェクションを防ぐ上で重要な役割を果たします。したがって、次のように設定することをお勧めします:

magic_quotes_gpc = On

(10) エラーメッセージ制御

一般に、php はデータベースに接続されていない場合、またはその他の状況下ではエラーを表示します。エラー メッセージには php が含まれます。

より前のスクリプト パス情報やクエリ SQL ステートメントやその他の情報は、この種の情報がハッカーに提供された後は安全ではないため、通常はサーバーでエラー プロンプトを無効にすることが推奨されます:

display_errors = Off

エラー情報を表示したい場合は、警告の上の情報のみを表示するなど、エラー表示のレベルを必ず設定してください:

error_reporting = E_WARNING & E_ERROR

もちろん, やはりエラープロンプトをオフにすることをお勧めします。

(11) エラーログ

サーバーが動作している理由を見つけるために、display_errorsをオフにしてエラー情報を記録することをお勧めします:

log_errors = On

またエラー ログの保存ディレクトリを設定するには、ルート Apache ログが一緒に存在することをお勧めします:

error_log = D:/usr/local/apache2/logs/php_error.log

注: ファイルは Apache を許可する必要があります。ユーザーとグループには書き込み権限が必要です。

MYSQL を制限された特権で実行します

mysqlstart などの新しいユーザーを作成します

net user mysqlstart funkmicrosoft /add

net localgroup users mysqlstart /del

どのグループにも属していません

MYSQL が d:mysql にインストールされている場合は、mysqlstart にフル コントロール権限を与えます

次に、システム サービスで MYSQL のサービス プロパティを設定し、このユーザー mysqlstart を選択し、パスワードを入力します。 。

MYSQL サービスを再起動すると、MYSQL は低い特権で実行されます。

Apache が Windos プラットフォーム上に構築されている場合、もう 1 つ注意する必要があります。デフォルトでは、Apache はシステム権限で実行されます

これは非常に不快な思いをさせるものです。 apache の権限。

net user apache funcmicrosoft /add

net localgroup users apache /del

ok どのグループにも属さないユーザー apche を作成しました。

コンピューターマネージャーを開き、サービスを選択し、Apacheサービスのプロパティをクリックし、ログオンを選択し、このアカウントを選択し、上で作成したアカウントとパスワードを入力し、

Apacheサービスを再起動します、 OK、Apache 低い特権で実行されます。

実際、Apache ユーザーが実行したいことのみを実行できるように各フォルダーの権限を設定し、ディレクトリごとに読み取りと書き込みが可能な個別のユーザーを作成することもできます。

これは、多くの仮想ホストプロバイダーで使用されている一般的な構成方法でもありますが、これを防ぐために使用すると過剰になります。


【2.PHPコードの書き方】

多くの国内の PHP プログラマーは SQL インジェクションを防ぐために依然として addlashes に依存していますが、中国語での SQL インジェクションを防ぐために全員がチェックを強化することをお勧めします。 addslashes の問題は、ハッカーが 0xbf27 を使用して一重引用符を置き換えることができるのに対し、addslashes は 0xbf27 を 0xbf5c27 に変更するだけで、有効なマルチバイト文字になる 0xbf5c は依然として一重引用符とみなされ、そのため addslashes は正常にインターセプトできないことです。
もちろん、addslashes は、マルチバイト文字の処理に使用されます。mysql_real_escape_string を使用します。 PHP マニュアルの get_magic_quotes_gpc の例:
(! Get_magic_quotes_gpc ()) {
$ LastName = addedlashes ($ _ Post ['LastName']); $ lastname = $_POST['lastname'];
}

magic_quotes_gpc がすでに開いているときに $_POST['lastname'] を確認するのが最善です。
2 つの関数 mysql_real_escape_string と mysql_escape_string の違いについて話しましょう:
mysql_real_escape_string は (PHP 4 >= 4.3.0、PHP 5) で使用する必要があります。それ以外の場合は、mysql_escape_string のみを使用できます。この 2 つの違いは、mysql_real_escape_string は接続の現在の文字セットを考慮するのに対し、mysql_escape_string は考慮しないことです。
要約すると:
* addlashes() は強制的な追加です。
* mysql_real_escape_string() は文字セットを決定しますが、PHP バージョンの要件があります
* mysql_escape_string は現在の文字セットを考慮しません。接続の文字セット。
---------------------------------------------- --- --------------------------------------------------- ---
PHP でコーディングする場合、いくつかの基本的なセキュリティの問題を考慮する場合、まず次のことを行います:
1. 変数を初期化します
なぜこのように言えるのでしょうか?次のコードを見てみましょう:
PHP コード
';
include('admin.php');
} else 'あなたは管理者ではないので管理できません。 ' ;たとえば、私たちのページが http://daybook.diandian.com/login.php である場合、次のように送信します: http://daybook.diandian.com/login.php?admin=1、はは、考えてみてください。あなたが直接管理者であるか、直接管理します。
もちろん、私たちはそのような単純な間違いをしないかもしれませんが、非常に秘密の間違いによってこの問題が発生する可能性もあります。たとえば、phpwind フォーラムには抜け穴があり、これにより管理者権限を直接取得できます。 $skin 変数は初期化されていないため、後で一連の問題が発生します。では、上記の問題を回避するにはどうすればよいでしょうか?まず、php.ini から始めて、php.ini で register_global =off を設定します。これは、登録されているすべての変数がグローバルであるわけではないことを意味するため、これを回避できます。ただし、私たちはサーバー管理者ではないので、コードからしか改善できません。では、上記のコードをどのように改善すればよいでしょうか。これを次のように書き換えます:
PHP コード pass'])
{ echo 'ログインに成功しました! ';
include('admin.php');
} else 'あなたは管理者ではないので管理できません。 '; 変数を $admin = 0 に初期化すると、この脆弱性を通じて管理者権限を取得できなくなります。
2. SQL インジェクション (SQL インジェクション) を防ぐ
SQL インジェクションは、基本的に過去 2 年間で中国で普及したテクノロジである asp から php までを含め、現在最も有害なプログラムであるはずです。フィルタリングせずに変数を送信すると、インジェクション ポイントが作成され、悪意のあるユーザーが一部の SQL クエリ ステートメントを送信できるようになり、重要なデータが盗まれたり、紛失したり、破損したり、バックエンド管理に侵入されたりする可能性があります。
基本的な注射侵入方法は理解できたので、どうすればそれを防ぐことができるでしょうか?コードから始めましょう。
Web 上でデータを送信するには 2 つの方法があることはわかっています。1 つは get で、もう 1 つは post です。そのため、一般的な SQL インジェクションは get メソッドから始まり、インジェクション ステートメントにはいくつかの SQL ステートメントが含まれている必要があります。 SQL ステートメントがありません。どうすればよいですか? SQL ステートメントには、select、update、delete、insert という 4 つがあります。では、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか。
そこで、正規表現を使用して次の関数を構築します:
PHP コード

return eregi('select|insert|update| delete|' | 関数 verify_id($id=null) { elseif (inject_check($id)) { exit('提出されたパラメータが不正です!') } // インジェクション判定
elseif (!is_numeric($id)) { exit('提出されたパラメータが不正です!') ; } // 数値判断
はは、それでは検証できるので、上記のプログラム コードは次のようになります:
PHP コード
}
それ以外は続けてください! ' ;
たとえば、「 _ 」、「 %」など、一部の文字はデータベースに害を及ぼす可能性があります。これらの文字には特別な意味があるため、これらを制御するとどうなるでしょうか。もう 1 つのポイントは、php.ini で magic_quotes_gpc = off に設定すると、データベースのルールに準拠していない送信されたデータの前に ' ' が自動的に追加されないことです。この場合、これらの問題を制御する必要があるため、次のように構築します。
PHP コード get_magic_quote s_gpc()) // magic_quotes_gpc がオンになっているかどうかを判断します

$str =addslashes($str) // フィルターで除外します
}
$str = str_replace("_", "_", $str); // '_' を除外します
$str = str_replace("%", "%", $str); // '%' をフィルターで除外します
またここに来ました これにより、サーバーが侵害されるリスクが回避されます。
最後に、投稿や記事やニュースの作成など、大量のデータを送信することを検討してください。上記の関数に基づいて、次の関数を構築します。コード
) // magic_quotes_gpc が開いているかどうかを判断します
{
$post = addlashes($post) // magic_quotes_gpc が開いていない場合は、送信されたデータをフィルタリングします。オープンしました
} }
$post = str_replace("_", "_", $post); // '_' を除外します
$post = str_replace("%", "%", $post); // ' を除外します% ' フィルタリング
$post = nl2br($post); // 変換を入力
$post= htmlspecialchars($post) // HTML タグの変換
} } ;? & Gt; & 呵、基本的に、ここではいくつかの状況について話しましたが、少なくとも 2 つの側面について話していることはほとんどないと思います。 , 次回は、PHP のセキュリティ構成や Apache のセキュリティなども含めて、セキュリティが全体として統合され、最も安全になるように、さらに詳しく話すことを検討します。
最後に、上記の内容を説明します: 1. 変数を初期化します 2. 変数を必ずフィルターします


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート