ホームページ >バックエンド開発 >PHPチュートリアル >PHP プログラミング関数 safety_PHP チュートリアル
Webセキュリティをやりたい人は、Webセキュリティを使って学ぶのが一番良いのですが、根本を考えると、私たちが求めているのは魚ではなく釣りです。中国では、さまざまな PHP プログラムのバージョン 1.0 とバージョン 2.0 が雨後の筍のように現れていますが、誰もがいくつかの有名な cms、フォーラム、ブログ プログラムに注目しています。 PHP プログラマーや Web マスターは、サーバーの要塞設定に依存するだけでなく、PHP プログラム自体のセキュリティについても理解する必要があります。
PHP のセキュリティはインジェクションとクロスサイトに過ぎないと言う人もいますが、それは完全に間違っています。もしこれが事実であれば、magic_quotes_gpc またはサーバーの一部のセキュリティ設定により、私たちは生き残ることができなくなります。今日はこれを行いたいと思います。インジェクションやクロスサイトについて話しているのではなく、PHP プログラムに存在するセキュリティの詳細について説明します。
いくつかの関数のフィルタリングに注目してください。いくつかの関数は頻繁に使用されます。 include()、require()、fopen()、fwrite()、readfile()、unlink()、eval() およびそのバリアント関数などのプログラムでは、これらの関数は実用的ではありません。もっと注意する必要があります:)
1. Include()、require()、fopen()、include_once()、require_once() はすべてリモートでファイルを呼び出すことができます。 Google で検索すると、呼び出しに含まれる変数がフィルターされていない場合、任意のファイルを実行に含めることができます。たとえば、print.php を見てください
…
if (empty ($bn) ) { //変数 $bn が空かどうかを確認します
include (“$cfg_dir/site_${site}.php”) //Put $cfg_dir パスの Site_${site}.php が含まれています
...
$cfg_dir ディレクトリの有無に関係なく、$site 変数をまったくチェックしないため、$site 変数を自然に使用できます。変数 $site を指定してリモート ファイルを呼び出すことも、ローカル ファイルにすることもできます。指定したファイルに php ステートメントを書き込むと、この
列のように php ステートメントを含むファイルがインクルードされて実行されます。ファイル ディレクトリは、phpwind や bo-blog の以前の脆弱性と同様に、権限を昇格するためにいくつかの管理者ファイルを含めるように拡張することもできます。 php.ini のallow_url_fopen を off に設定してファイルのリモート使用を禁止し、open_base_dir を使用してディレクトリ外のファイルの使用を禁止することに加えて、どのファイルのみを含めることができるかを事前に宣言する必要もあります。ここでは詳細に立ち入りません。
2.fopen()、file()、readfile()、openfile() なども特に注意を払う必要がある領域です。関数自体はファイルを開くことだけが目的ですが、変数を徹底的にフィルタリングしないとソースコードが漏洩してしまいます。このような機能テキスト フォーラムは数多くあります。
…
$articlearray=openfile(“$dbpath/$fid/$tid.php”); //パス $dbpath/$fid にある $tid.php ファイルを開きます
$topic_detail=explode(“|”,$ Articlearray [0]); //区切り文字 | を使用して投稿の内容を読み取ります
...
これは ofstar の read.php の以前のバージョンで、$fid と $tid にはフィルタリングがありません。ファイル送信として指定されている場合、元のコードが漏洩しました。このような。
$tidにはphpが付くので、indexを直接書きます。これはほんの一例ですので、見てみましょう。
3.fwrite() とそのバリアント関数にはこの種の脆弱性があります。考えてみれば、ユーザーが送信した文字がフィルタリングされていなければ、PHP バックドアを作成することは不可能ではありません。
4.unlink() 関数。少し前まで、この関数は phpwind でファイルを任意に削除するために使用されていました。削除するかどうかを決定するために使用される変数にはフィルタリングがありません。任意のファイルの変数を削除できます。
5.eval()、preg_replace() 関数は、文字列が何らかの方法でフィルタリングされていない場合に何が起こるでしょうか。一言で言えば、これが使われているのをよく目にします。 eval() 原則に基づいて作成された PHP トロイの木馬ではないでしょうか?
6. system() などのシステム関数については、php.ini でシステム関数を無効にすることも良い考えですが、一部のプログラムで必要な場合は無効にする必要があります。必要ですか?前回見た美しいphpの写真集のように。さらに、popen()、proc_open()、および proc_close() 関数には特別な注意を払う必要がありますが、コマンドの実行後に直接出力はありませんが、これはハッカーにとって有益だと思いますか?ここで、PHP は 2 つの関数、escapeshellarg() とscapeshellcmd() を提供します。これらの 2 つの関数は、システム関数呼び出し攻撃 (フィルタリング) に対抗するために使用されます。
害については、例として、あるフォーラムの prod.php を見てみましょう
07 $doubleApp = isset($argv[1]); //変数 $doubleApp を初期化します
…
14 if( $doubleApp ) / /if ステートメント
15 {
16 $appDir = $argv[1]; //$appDir を初期化します
17 system("mkdir $prodDir/$appDir") //システム関数 system を使用してディレクトリ $prodDir/ を作成します$appDir
本来は $prodDir/$appDir ディレクトリを作成するために使用されます。その後、プログラムは $argv[1] が存在するかどうかのみを検出し、$argv[1] に必要なフィルタリングが欠けているようです。
/prod.php? argv[1]=|ls%20-la または /prod.php?argv[1]=|cat%20/etc/passwd
(ここでの区切り文字 | は、UNIX パイプ パラメーターです。複数のコマンドを実行します。)
この時点で、一般的なタイプの脆弱性について少し知っておく必要があります。
したがって、サーバー側の設定だけに頼るのではなく、バックグラウンド プログラムに注意を払うことが最善です。一般的には、サーバー経由でサイトをセットアップする方が良いでしょう。しかし、データベースを使用した多くの操作は、制御するのがそれほど簡単ではありません。