gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

php.ini調査の続き

あちこちのフレームワークでは「何してるんだろう?」って思ったので。
以下のフレームワークを調査してみますた。


CodeIgniter_2.1.2
cakephp-cakephp-e0b6f86
symfony-1.4.18
Symfony2
FuelPHP


調査は、サーバに入れてからgrepでini_setを探すという高難易度調査w
で、その中から興味があったモノを抜き出してみました。


ini_set('unserialize_callback_func', 'spl_autoload_call');
http://php.net/manual/ja/var.configuration.php

unserialize() が未定義のクラスを使おうとしたときに、ここで指定したコールバックをコールします。

あぁなるほろ。
ん…いらんかなぁ。


ini_set('html_errors', 'On');

エラーメッセージのHTMLタグをオフにします。htmlエラー用の新しい形 式では、ユーザーがエラーまたはエラーを発生した関数を説明するページ に導くようクリック可能なメッセージを出力します。

ふむり…個人的にはoffだなぁ。ってわけで、MWではoffだw
つか日本語が分かりにくい。「エラーメッセージのHTMLタグをオフにします」だと、trueの時に「オフになるのか」「オンになるのか」どちらの意味にも取れる。
実験の結果「trueだとHTMLタグ付きのエラーメッセージにして」「falseだとHTMLタグなしのエラーメッセージ」になるぽい。
とはいえ、ここは賛否両論激しそうだなぁ(苦笑


ini_set('magic_quotes_runtime', 0);

magic_quotes_runtime が有効の場合、 データベースおよびテクストファイルを含む外部ソースから データを返す全ての関数のクオートは、バックスラッシュで エスケープされます。

むぅ危ないなぁ問答無用でoffだ。

ini_set('docref_root', '');

新しいエラーフォーマットはエラーやエラーの原因となった関数に関するマニュアル のページの情報を含んでいます。マニュアルのページによっては母国語でダウンロードが 可能であり、このiniディレクティブをマニュアルのローカルコピーのURLにセット することができます。

面白いけど一端オミットでいいや。


ini_set('arg_separator.output', '&');

PHPがURLを生成する際にURL引数を区分するために使用されるセパレータ。

………はぁ?
あぁどうも http_build_query()関数 http://jp.php.net/http_build_query 用っぽい。
いらね。使わないもんこんな関数。


ini_set('implicit_flush', true);

デフォルトは FALSE です。これを TRUE に変更すると、PHP が 各出力ブロックの後で自動的に出力レイヤをフラッシュするよう 指定します。これは、各 print あるいは echo そして HTML ブロックの後で flush() 関数をコールすることと等価です。

あぁデバッグ用だねぇ完璧に。
これは…error_displaysと一緒の場所に置いておくとよいかなぁ。


ini_set('max_execution_time', 0);

スクリプトがパーサにより強制終了されるまでに許容される最大の 時間を秒単位で指定します。この命令は、いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのに役立ちます。 デフォルトでは、30 に設定されています。 PHPコマンドライン から実行する場合のデフォルト設定は 0 です。

30は微妙にしても、設定はしておいたほうがよいかも。


ini_set('track_errors', 1)

有効にした場合、直近のエラーメッセージが、 $php_errormsg 変数に常に代入されます。

ふむぅり微妙…


ini_set('user_agent', 'Fuel PHP framework - Agent class (http://fuelphp.com)');

送信する PHP 用のユーザーエージェントを定義します。

いやなんか面白かったので載せた。ただそれだけ(笑


ini_set('zlib.output_compression', 0);

透過的なページ圧縮を行うかどうか。php.ini または Apache の設定でこのオプションが、"On" に設定された場合、 ブラウザが "Accept-Encoding: gzip" または "deflate" ヘッダを送信する場合に、ページは圧縮されます。

あら…結構大事ぢゃないかしらん?
まぁApacheのmod_deflateあたりを使う方がいい気もするんだけど。


ini_set("log_errors", 1);

エラーメッセージを、サーバーのエラーログまたはerror_logに記録するかどうかを指定 します。このオプションはサーバーに依存します。

固定onでいいような気がするなぁ。


ini_set('short_open_tag', 'off');

PHP タグの短縮型 () を使用 可能にするかどうかを設定します。PHPXMLと組み合わせて用いる 場合は、をファイル中で用 いるためにこのオプションをオフにする必要があります。

賛否両論あるけど、まぁPHP5.4以降「常時on」との事なので、onにしておきませう。
どのみち「HTMLん中にPHP混在」は、MWじゃ基本御法度だw


ini_set('register_globals', 'off');
なにをか言わんや。
っつか、これがonのところってまだあるのん?


ini_set('allow_call_time_pass_reference', 'on');

関数のコール時に引数が参照で渡された場合に、警告するかどうかを設定します。 推奨される方法は、関数宣言時に参照渡しとするべき引数を指定することです。 将来のバージョンでの動作を保障するために、 このオプションを off とし、 スクリプトがこの状態で正しく動作することを確認することが推奨されます (この機能を使用する度に警告が発生します)。

ほほぉこんなものが。
まぁ気にしないでもよかろう。


ini_set('precision', 14);

浮動小数点数に関して表示される最大桁数を指定します。

…あぁ。これもいいか。フレームワークでわざわざ指定せにゃならんもんとも思えないし。


おいちゃんが個人的にmemoってて、かつ上に出てきてないあたりはこの辺。
ini_set('session.cookie_httponly', true);

クッキーに対して、HTTP を通してのみアクセスできるようにします。 つまり、JavaScript のようなスクリプト言語からはアクセスできなくなるということです。 この設定を使用すると、XSS 攻撃によって ID を盗まれる危険性を減らせます (が、すべてのブラウザがこの設定をサポートしているというわけではありません)。


ini_set('memory_limit', '64M');
「どの程度にするか」はともかく、制限は入れておいた方がよいと思う。ただ、某フレームワークとか「普通にコードを1レコード取得するだけのSQL1本ながしたら34M以上のメモリ食いやがった」とかいう実例があるので、数値をどれくらいにするかは悩ましいところなんだろうなぁ。
MWは「(そういう意味では)軽量」目指してるからいいけどw


ini_set('expose_php', off);

PHP がサーバーにインストールされていることを全世界に晒し、PHP のバージョンも HTTP ヘッダに含めます (X-Powered-By: PHP/5.3.7 など)。

いやまぁ「隠してセキュア」とは思わんけど、わざわざ晒すこともねぇだろう、的な。


ini_set('max_input_time', 30);

スクリプトが POST、GET などの入力を パースする最大の時間を、秒単位で指定します。 これは、サーバーがすべてのデータを受け取ってからスクリプトの実行を開始するまでの時間です。

ini_set('max_input_vars', 500);

入力変数 を最大で何個まで受け付けるかを指定します。 このディレクティブを使うと、ハッシュの衝突を悪用したサービス不能攻撃を受ける可能性を軽減できます。 このディレクティブで設定した数を超える入力変数があった場合は E_WARNING が発生し、 それ以降の入力変数はリクエストから削除されます。 多次元配列

こないだ増えた、アタック用だねぇ。全体で60秒にしてるんだから、パースで30秒とかが限界だと思うんだけど、どうだろうねぇ?
パラメタは…500とかなさそうだけど、100だと微妙に不安なので。
この辺は、後で色々数値調整すると思う。



あと、セッション関係を一応おさらい。
ini_set('session.entropy_file', '/dev/urandom');
ini_set('session.entropy_length', '16');
ini_set('session.hash_function', '1');
ini_set('session.use_only_cookies', '1');
ini_set('session.cookie_lifetime', '0');
ini_set('session.cache_expire', 20);
ini_set('session.use_trans_sid', '0');
ini_set('session.name', 'session_id');
が必須かと思ってる。
ini_set('session.auto_start', 'off');
は、お好みに応じてonでもoffでも。


ってなわけで、MWで足し込むのはこの辺かねぇ。

// エラーメッセージのHTMLタグをオフにする
ini_set('html_errors', false);

// データベースおよびテクストファイルを含む外部ソースから データを返す全ての関数のクオートをつけない
ini_set('magic_quotes_runtime', 0);

// タイムアウト設定
ini_set('max_execution_time', 60);

// エラーメッセージを、サーバーのエラーログまたはerror_logに記録する
ini_set("log_errors", true);

// 5.4以降は常にonなので、そうしておく
ini_set('short_open_tag', true);

// 一応念のため〜
ini_set('register_globals', 'off');

// CookieがJavaScriptからはアクセスできなくなる…かもしれない程度の保証
ini_set('session.cookie_httponly', true);

// ンなに重くてもこまるでしょう、的な
ini_set('memory_limit', '64M');

// PHPという素性は一応隠すよ〜
ini_set('expose_php', off);

// GET、POSTのパース最大時間(秒)
ini_set('max_input_time', 30);
// パラメタの最大数
ini_set('max_input_vars', 500);



/*
セッション使う場合、ここを有効にしてくださりませ。っつか別ファイルにすっか。
// 基本設定群
ini_set('session.entropy_file', '/dev/urandom');
ini_set('session.entropy_length', '16');
ini_set('session.hash_function', '1');
ini_set('session.use_only_cookies', '1');
ini_set('session.cookie_lifetime', '0');
ini_set('session.cache_expire', 20);
ini_set('session.use_trans_sid', '0');
ini_set('session.name', 'session_id');

// セッションは自動で開始するようにしておく
ini_set('session.auto_start', true);
*/


あと、デバッグ出力付近に、これを足しましょう。

// デバッグ用。性能落ちるから気をつけてね〜
ini_set('implicit_flush', true);

// 本番用
ini_set('implicit_flush', false);


さて。
次は「出力するhttp response header」の調査しないとねぇ。