名前 | デフォルト | 変更の可否 | 変更履歴 |
---|---|---|---|
safe_mode | "0" | PHP_INI_SYSTEM | PHP 6.0.0 で削除。 |
safe_mode_gid | "0" | PHP_INI_SYSTEM | PHP 4.1.0 から利用可能。PHP 6.0.0 で削除。 |
safe_mode_include_dir | NULL | PHP_INI_SYSTEM | PHP 4.1.0 から利用可能。PHP 6.0.0 で削除。 |
safe_mode_exec_dir | "" | PHP_INI_SYSTEM | PHP 6.0.0 で削除。 |
safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | PHP 6.0.0 で削除。 |
safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM | PHP 6.0.0 で削除。 |
open_basedir | NULL | PHP_INI_ALL | PHP < 5.3.0 では PHP_INI_SYSTEM。 |
disable_functions | "" | php.ini only | PHP 4.0.1 から利用可能 |
disable_classes | "" | php.ini only | PHP 4.3.2 から利用可能 |
PHP_INI_* モードの詳細および定義については どこで設定を行うのか を参照してください。
以下に設定ディレクティブに関する 簡単な説明を示します。
セーフモードの設定ディレクティブの簡単な説明を以下に示します。
セーフモードを有効にするか否か。 PHP が --enable-safe-mode でコンパイルされている場合のデフォルトは On、そうでないときのデフォルトは Off です。
この機能は PHP 5.3.0 で 非推奨となり、PHP 6.0.0 で削除されます。 この機能を使用しないことを強く推奨します。
デフォルトでは、セーフモードはオープンしようとするファイルの UIDの比較チェックを行います。GIDの比較にすることでこのチェックを 緩やかなものにしたい場合、safe_mode_gidをオンにしてください。 ファイルにアクセスする際にUID (FALSE)を使用するか GID (TRUE)を使用するか制御できます。
このディレクトリ(そのサブディレクトリも含む)の配下のファイルが インクルードされる場合、UID/GID のチェックはバイパスされます。(ディレクトリは include_pathの配下であるか あるいはフルパスで記述される必要があります)
PHP 4.2.0以降、このディレクティブは include_pathと同様に コロン(Windowsではセミコロン)で分けた形式で複数のパスを書くことができます。 ここで指定される制限は実はプレフィックスでありディレクトリ名ではありません。 つまり、"safe_mode_include_dir = /dir/incl" と書くと "/dir/include" と "/dir/incls" の両方へのアクセスが許可されます(もしディレクトリが存在すれば)。 指定したディレクトリのみを許可したい場合には、最後にスラッシュを追加してください。 例:"safe_mode_include_dir = /dir/incl/" PHP 4.2.3 と PHP 4.3.3 以降では、ディレクティブの値が空の場合、 異なる UID/GID を持つファイルを インクルードすることはできません。 以前のバージョンでは、全てのファイルをインクルード可能でした。PHPがセーフモードで動作する場合、system()や その他のプログラム実行関数を、 このディレクトリ以外で起動することは拒否されます。 Windowsを含む全ての環境において ディレクトリのセパレータとして/を使用する必要があります。
ある種の環境変数の設定はセキュリティ上の潜在的な欠陥となりえます。 このディレクティブにはプレフィックスをカンマで区切って書くことができます。 セーフモードでは、ここに書かれたプレフィックスで始まる環境変数だけを ユーザーが変更できるようになります。デフォルトでは、ユーザーは PHP_ で始まる名前の環境変数 (PHP_FOO=BAR など) だけをセットすることができます。
注意: このディレクティブが空の場合、PHPは全ての環境変数について ユーザーが変更することを許可してしまいます。
putenv()を使ってエンドユーザーが変更するのを 防ぎたい環境変数をカンマ区切りで記述します。ここで設定された環境変数は もしもsafe_mode_allowed_env_varsでは許可されているものであっても 保護されます。
PHPによってオープンされうるファイルを特定のディレクトリツリー に制限します。このディレクティブはセーフモードのオン/オフに 関わらず適用されます。
例えば fopen() や gzopen() を使ってスクリプトがファイルをオープンしようとすると、 そのファイルの位置がチェックされます。 指定されたディレクトリツリーの範囲外にあった場合、PHP はオープンを拒否します。 全てのシンボリックリンクは解決されるので、 シンボリックリンクを使ってこの制限を回避することは不可能です。 ファイルが存在しない場合はシンボリックリンクの解決は行われず、 ファイル名の比較は open_basedir に対して行われます。
.は特別な値で、 スクリプトが格納されているワーキングディレクトリをベースディレクトリとして 使用することを意味します。 これは、しかし、スクリプトのワーキングディレクトリが chdir()により容易に変更されるために やや危険です。
httpd.confの中で、open_basedir はオフにすることができます (例: 仮想サーバの場合)。 他の設定ディレクティブと 同様に "php_admin_value open_basedir none" とします。
Windows上では、ディレクトリをセミコロンで区切ってください。 その他全てのシステムでは、ディレクトリをコロンで区切ってください。 Apacheモジュールでは、親ディレクトリから open_basedir へのパスは自動的に継承されます。
ここで指定される制限は実はプレフィックスでありディレクトリ名ではありません。 つまり、"open_basedir = /dir/incl" と書くと "/dir/include" と "/dir/incls" の両方へのアクセスが許可されます(もしディレクトリが存在すれば)。 指定したディレクトリのみを許可したい場合には、 最後にスラッシュを追加してください。 例:open_basedir = /dir/incl/
デフォルトでは全てのファイルのオープンが許可されます。
注意: PHP 5.3.0 以降、実行時に open_basedir をより厳しくできるようになりました。 つまり、open_basedir が php.ini で /www/ に設定されていた場合、スクリプト内で ini_set() を使って設定を /www/tmp/ にすることができます。
注意: Availability note
このディレクティブはPHP4.3.2で追加されました。
register_globals, display_errors, log_errorsも参照してください。
セーフモードがonの場合、PHPは、 現在のスクリプトの所有者がファイル関数により処理されているファイルまたはディレクトリ の所有者に一致するかどうかを調べます。例えば、
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
script.php を実行すると、
<?php
readfile('/etc/passwd');
?>
セーフモードが有効な場合、以下のようなエラーが出力されます。
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
UID checking. しかし、多くの環境において、厳密なUIDチェックは 適切ではなく、より緩やかなGIDチェックで十分です。 これはsafe_mode_gidスイッチで サポートされます。これをOnにすると制限の緩い GIDチェックに、Off(デフォルト) にするとUIDチェックになります。
safe_modeの代わりに、 open_basedirディレクトリを セットすると、全てのファイル操作は特定のディレクトリ配下のみに制限されます。 例えば(Apacheのhttpd.confの例):
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
open_basedirでセットしたのと 同じ script.php を実行すると、以下のような結果になります:
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2
特定の関数を無効にすることもできます。 disable_functionsディレクティブは php.ini以外では使用できないことに注意してください。 つまり、httpd.conf上のバーチャルホスト毎あるいはディレクトリ毎に 関数を無効にすることはできない、ということになります。 もしphp.iniファイルに以下を追加した場合:
disable_functions = readfile,system
以下のような結果になります:
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2
もちろん、これらの PHP の制限はバイナリを実行した場合は有効になりません。