関連:
- PHP/tips/日本語環境php.ini設定
- PHP/脆弱性リスト/メモ
- PHP/脆弱性リスト/PHP5
- PHP/脆弱性リスト/PHP4
- PHP/patch/allow_url_include
- PHP/patch/StrictSession
推奨php.ini設定 †
ハードコードされた設定(ソースコードに埋め込まれた設定)やphp.ini-dist, php.ini-recommendedの設定は必ずしもお薦めできる設定となっていません。デフォルト設定から変更した方が良いと思われる運用時の推奨設定です。
register_globals=off等、デフォルト値のままで利用すべき設定の説明は省略しています。
開発時はエラーの表示等は必要でしょう。
PHP 5.2.4のphp.ini-distと異なる推奨設定 †
allow_call_time_pass_reference = off †
関数の呼び出し側で参照呼び出しを許可する設定。本来このような機能は必要ない。コードに含まれる場合はコードを修正する。
open_basedir= <phpが参照する最も高いレベルのディレクトリを設定> †
open_basedir=/var/www に設定すると/tmp /var/tmpなどへアクセス出来ななります。ただし、モジュール関数を利用したopen_basedir制限を回避してアクセス可能な場合があります。スクリプトにバグが合った場合に不必要なファイルを参照できなくさせるフェイルセーフ設定です。運用環境では必ず設定する。
expose_php=off †
犯罪者はWebサーバの種別、バージョン、インストールされたモジュール等をデータベース化しています。犯罪者にPHPがインストールされている事、バージョン等をわざわざ教える必要はありません。*1
error_reporting=E_ALL | E_STRICT †
スクリプトはE_NOTICE、E_STRICTを含め通常の動作ではエラーが発生しないように記述されているべきです。
display_errors=off †
開発環境以外ではエラーメッセージは表示されるべきではありません。
log_errors=on †
エラーは必ずログしなければなりません。
log_errors_max_len=4096 †
デフォルトは1024ですが攻撃の内容を詳しく知る為に4KB程に設定する方が良いでしょう。
error_log= [filename | syslog] †
必ずどこかにエラーログは記録しなければなりません。
register_long_arrays=off †
$_GET, $_POST等、短い入力配列が利用できないスクリプトはかなり古いスクリプトと考えられます。コードの安全性を検証して問題なく、$HTTP_*_VARSが必要な場合にのみ有効にします。
register_argc_argv=off †
Webアプリケーションでは必要ありません。
magic_quotes_gpc=off †
日本語環境ではoffにするべきです。ただし、magic_qutoe_gpc=onを前提としているアプリケーションの場合、SQLインジェクションが可能になってしまう場合があります。コードを確認してmagic_quote_gpc=onが必要な場合はコードを修正します。*2
default_mimetype="text/plain" †
MIMEタイプをtext/plainにすると誤ってtext/htmlで送信し、不必要なJavaScriptを送信してしまうリスクを無くす事ができます。*3ただし、ほとんどのアプリケーションはtext/htmlがデフォルト設定であることを前提としているのでtext/plianに変更すると正しく動作しないことが多いと思います。
default_charset="UTF-8" †
セキュリティ上、文字エンコーディングは必ずHTTPヘッダで設定されていなければなりません。UTF-8でなくてもEUC-JP, SJISでも構いませんが必ず文字エンコーディングが設定されるようなんらかの文字エンコーディングを指定しておくべきです。*4
file_uploads=off †
ファイルアップロード機能を必要としていない場合、offに設定します。
allow_url_include=off †
ほとんどのinclude/require文はリモートスクリプトにアクセスする必要がないので必ずoffに設定する。リモートスクリプトにアクセスが必要な箇所でのみスクリプト中からonに設定する。
session.use_only_cookies=1 †
必ず1に設定します。0の場合、URLに含まれたセッションIDが利用されセッションIDの固定化(Session Adoption/Fixation)に脆弱になります。
session.gc_divisor = 1000 †
忙しいサーバの場合、1000、2000等大きな値に設定します。
session.bug_compat42 = 0 †
普通に$_SESSION配列を使用していれば0で問題は発生しません。
session.entropy_length = 32 †
UNIX系OSで/dev/urandomがある場合は設定します。
session.entropy_file = /dev/urandom †
UNIX系OSで/dev/urandomがある場合は設定します。/dev/randomに設定してはいけません。
session.hash_function = 1 †
0でMD5, 1でSHA1が利用されます。弱いハッシュ関数を利用する意味や必要性があるアプリケーションはほとんどありません。
session.cookie_httponly = 1 †
JavaScriptでセッションIDを利用しない場合はかならず1に設定する。
*1 expose_php=offに設定するとphpinfo()でロゴイメージが表示されなくなります。これらのロゴイメージによってPHPが動作している事、フィンガープリンティングによってバージョンの特定が可能になるからです
*2 magic_quote_gpcによるSQLインジェクション対策は不十分極まります。セキュリティ面でもmagic_quote_gpc=onは有害です。基本的にmagic_quote_gpc=offにするべきです。
*3 IEはコンテンツタイプを無視してくれるのでこの設定が有効に機能しませんが、ここではシェアが多いブラウザの仕様ではなく、よりセキュアな設定としてtext/plainをお勧めしています
*4 CERTが2000年に出したXSSのアドバイザリの中でも「動的にHTMLを生成する場合、文字エンコーディングを指定するべき」と指摘しています。