【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 の害を制限できます。
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 ,unlink ,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
上記は一般的に使用されるファイル処理関数の一部です。また、上記の実行コマンド関数を組み合わせることもできます。この関数を組み合わせると、
はほとんどの phpshell に耐えることができます。
(7) http ヘッダーの PHP バージョン情報の漏洩をオフにする
ハッカーがサーバー内の PHP バージョン情報を取得するのを防ぐために、http ヘッダーの情報の漏洩をオフにすることができます:
Expose_php = Off
たとえば、ハッカーが Telnet www.12345.com 80 を使用すると、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 プラットフォーム上に構築されている場合、Apache はデフォルトでシステム権限で実行されるため、非常に不快に感じます。次に、Apache の権限を下げてみましょう。
net user apache funcmicrosoft /add
net localgroup users apache /del
ok どのグループにも属さないユーザー apche を作成しました。
コンピューターマネージャーを開き、サービスを選択し、Apacheサービスのプロパティをクリックし、ログオンを選択し、このアカウントを選択し、上で作成したアカウントとパスワードを入力します。
Apacheサービスを再起動します。OK、Apacheが実行されます低い権限で降りました。
実際、Apache ユーザーが実行したいことのみを実行できるように各フォルダーの権限を設定し、ディレクトリごとに個別の読み取り/書き込みユーザーを作成することもできます。
これは、現在の多くの仮想ホスティングプロバイダーの間で一般的な構成方法でもありますが、この方法をこれを防ぐために使用すると過剰になります。
【2. PHP コードの記述】
もちろん、addslashes は役に立たないわけではありません。マルチバイト文字の場合は、mysql_real_escape_string を使用します。
さらに、php マニュアルの get_magic_quotes_gpc の例:
$lastname = addlashes($_POST['lastname']);
} else {
$lastname = $_POST['姓']
}
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 は考慮しないことです。
要約すると:
* addedlashes() は強制的な追加です。
* mysql_real_escape_string() は文字セットを決定しますが、PHP バージョンの要件があります。
* mysql_escape_string は接続の現在の文字セットを考慮しません。
------------------------------------------------- --------------------------------------
PHPでコーディングする際に考慮すると基本的なセキュリティの問題について、まず第一に:
1. 変数を初期化します
なぜこれを言うのですか?次のコードを見てみましょう。 ';
include('admin.php');
}
else
{echo 'あなたは管理者ではないので管理できません。 ';
}? & Gt;
さて、上記のコードは問題なく実行できるようです。それでは、どうなるでしょうか。たとえば、私たちのページが http://daybook.diandian.com/login.php である場合、次のように送信します: http://daybook.diandian.com/login.php?admin=1、はは、考えてみてください。あなたが直接管理者であるか、直接管理します。
もちろん、私たちはそのような単純な間違いをしないかもしれません。また、非常に秘密の間違いによってこの問題が発生する可能性もあります。たとえば、phpwind フォーラムには管理者権限がないため、直接取得できる抜け穴があります。 $skin 変数。初期化は後で一連の問題を引き起こします。では、上記の問題を回避するにはどうすればよいでしょうか?まず、php.ini から始めて、php.ini で register_global =off を設定します。これは、登録されているすべての変数がグローバルであるわけではないことを意味するため、これを回避できます。ただし、私たちはサーバー管理者ではないので、コードからしか改善できません。では、上記のコードをどのように改善すればよいでしょうか。以下のように書き換えます:
PHPコード
/ 判定提出管理 ユーザーのユーザー名とパスワードに対応する処理コードです
// ...
$管理者 = 1;
}
$ 管理者 = 0; '; ' ; = 0 の場合、この脆弱性を利用して管理者権限を取得することはできません。
2. SQL インジェクションを防止する
SQL インジェクションは、ASP から PHP への初期のものを含め、現在最も有害なプログラムであるはずです。これは基本的に、送信された変数をフィルタリングしないことによってインジェクション ポイントを形成することです。その後、悪意のあるユーザーが一部の SQL クエリ ステートメントを送信できるようにすると、重要なデータが盗まれたり、紛失したり、破損したり、バックエンド管理に侵入されたりする可能性があります。
注射侵入の基本的な方法は理解できたので、どうすればそれを防ぐことができるでしょうか?コードから始めましょう。
Web 上でデータを送信するには 2 つの方法があることはわかっています。1 つは get で、もう 1 つは post です。そのため、一般的な SQL インジェクションの多くは get メソッドから始まり、SQL がないため、インジェクション ステートメントにはいくつかの SQL ステートメントが含まれている必要があります。 SQL ステートメントには、select、update、delete、insert という 4 つの主要な文があるので、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか。 so次の関数を構築するために正規表現を使用します。 ]))
{ exit('送信したデータは不正です。確認して再送信してください!');
} else
{ $id = verify_id($_GET['id']); // ここで引用します フィルター関数を使用します$id echo '送信されたデータは正当です。続行してください! '; データ、大量のデータはどうなりますか?
たとえば、「_」、「%」などの一部の文字はデータベースに損害を与える可能性があります。文字には特別な意味があるので、それを制御したらどうなるでしょうか? もう 1 つのポイントは、php.ini で magic_quotes_gpc = off に設定されている場合、データベースのルールに準拠していない送信されたデータの前に ' ' が自動的に付けられることはありません。これらの問題を制御する必要があるため、次の関数を構築します:
PHP コード ?php function str_check($str)フィルター
}
$str = str_replace(" _ ", "_", $str); // '_' を除外します
$str = str_replace("%", "%", $str); // ' % ' を除外します
return $str ;?>
サーバーが侵害される危険は再び回避されました。
最後に、投稿や記事やニュースの作成など、大量のデータを送信することを検討します。上記の関数に基づいて、次の関数を構築します。 addedlashes($post); // magic_quotes_gpc がオンになっていない場合に修正を実行する
送信されたデータのフィルタリング
$post = str_replace("_", "_", $post) // '_' を除外する
$post = str_replace("%", "%", $post); // '%' を除外します$post
はは、基本的にこの時点で、いくつかの状況について話しました。実際、非常に多くのことを話したように感じます。少なくとも 2 つの側面についてのみ説明しており、セキュリティ全体についてはほとんど内容がありません。次回は、PHP セキュリティ設定、Apache セキュリティなどについて説明する予定です。全体として最も安全です。
最後に、上記の内容を説明します: 1. 変数を初期化します 2. 変数をフィルターすることを忘れないでください