忙しい人のためのphp.ini設定大全

vpsでやっているとphp.iniの設定で苦しめられることがあるので、
備忘録としてまとめておきます
よかったら参考にしてください
#目次
[忙しい方のための推奨設定一覧](#忙しい方のための推奨設定一覧)
[allow_url_fopen](#allow_url_fopen)
[allow_url_include](#allow_url_include)
[default_charset](#default_charset)
[disable_functions](#disable_functions)
[display_errors](#display_errors)
[enable_dl](#enable_dl)
[expose_php](#expose_php)
[file_uploads](#file_uploads)
[log_errors](#log_errors)
[magic_quotes_gpc](#magic_quotes_gpc)
[max_execution_time](#max_execution_time)
[max_input_time](#max_input_time)
[memory_limit](#memory_limit)
[register_globals](#register_globals)
[safe_mode](#safe_mode)
[session.cookie_httponly](#session.cookie_httponly)
[session.cookie_lifetime](#session.cookie_lifetime)
[session.cookie_secure](#session.cookie_secure)
[session.entropy_file](#session.entropy_file)
[session.gc_maxlifetime](#session.gc_maxlifetime)
[session.hash_function](#session.hash_function)
[session.use_cookies](#session.use_cookies)
[session.use_only_cookies](#session.use_only_cookies)
[session.use_trains_sid](#session.use_trains_sid)
#忙しい方のための推奨設定一覧
|設定|推奨値|初期値|
|:---:|:---:|:---:|
|allow_url_fopen|On|On|
|allow_url_include|Off|Off|
|default_charset|UTF-8||
|disable_functions|||
|display_errors|Off|On|
|enable_dl|Off|On|
|expose_php|Off|On|
|file_uploads|Off|On|
|log_errors|On|Off|
|magic_quotes_gpc|Off|On|
|max_execution_time|30|30|
|max_input_time|60|-1|
|memory_limit|32MB|128MB|
|register_globals|Off|Off|
|safe_mode|On|Off|
|session.cookie_httponly|On|Off|
|session.cookie_lifetime|0|0|
|session.cookie_secure|On|Off|
|session.entropy_file|/dev/urandom||
|session.gc_maxlifetime|1440|1440|
|session.hash_function|1(SHA1)|0(MD5)|
|session.use_cookies|On|On|
|session.use_only_cookies|On|On|
|session.use_trains_sid|0|0|
#allow_url_fopen
Onの場合外部のURLをローカルファイルと同じように読み込むことができる

```example.php
file_get_contents('https://satorunooshie.net');
```
しかしPHP5.2よりも前の場合は``include``や``require``などでも外部URLを読み込めるためインクルード攻撃を受ける可能性がある
PHP5.2以降ではallow_url_includeに分けられた
インクルード攻撃は

```example.php
include $_GET['text'];
```
のようにすると攻撃者が自由にサーバー上でコードを実行することができるようになるらしい
また``include``文の引数にユーザーの入力値を含まない場合でも
ファイルの中身がブラウザから確認できる場合、インクルードファイルの流出によって攻撃の手がかりを与えることになるので注意
インクルードファイルをドキュメントルートよりも上に配置すれば大丈夫
#allow_url_include
Offのままで良い、理由は前述
#default_charset
HTTPヘッダーでの文字エンコードの指定
指定しない場合XSSの危険性があるので``UTF-8``に指定する
特定のページのみ変更する場合は``ini_set()``関数か``header()``関数を使う
#disable_functions
無効にする内部関数の設定
コーディング規約などで利用を禁止している場合や危険な関数を利用しない場合に設定する

```php:php.ini
disable_functions = exec,popen,passthru,system
```
#display_errors
Offに設定する
エラーメッセージはHTMLエスケープされずに出力されるのでXSSが可能なことがあるため
#enable_dl
PHPの拡張モジュールをスクリプト内からロードできる
PHP5.3以降では非推奨
#expose_php
OnにするとHTTPヘッダーにPHPのバージョンが表示される
が、隠してもセキュリティが向上するわけではないらしい
#file_uploads
ファイルアップロード機能を使わない場合はOff
#log_errors
必ずOn
#magic_quotes_gpc
自動的にバックスラッシュでエスケープ処理が行われる
``addslashed()``関数と同じ
PHP5.3で非推奨でPHP5.4で削除

#max_execution_time
PHPスクリプトの最大実行時間を秒で指定
この値を長く設定するとDoS攻撃のリスクを高めるので注意
#max_input_time
スクリプトを実行する前の入力データを解析する最大秒数
同様にDoS攻撃のリスクが高まる
#memory_limit
PHPが使用可能なメモリの上限を指定する
DoS攻撃やバグによるメモリの課題消費を抑えるために32GBが適切っぽい
#register_globals
Onにすると意図しない変数の初期化が行われる可能性がある
以下のコードは同じような危険がある
PHP5.3で非推奨に、PHP5.4で削除された

```example.php
extract($_POST);
foreach ($_POST as $key => $val) {
	$key = $val;
}
```
#safe_mode
共有サーバーではOn
PHP5.3で非推奨、PHP5.4で削除された
#session.cookie_httponly
セッションCookieにHttpOnly属性を指定
#session.cookie_lifetime
セッションCookieの有効期限を指定
0の場合はブラウザを終了するまで
#session.cookie_path
セッションCookieを送信するパスの指定
共有サーバーの場合自分のディレクトリを指定しないと、
他のユーザーのディレクトリにアクセスした場合にセッションIDが漏洩したり、セッションが共有される可能性がある
#session.cookie_secure
全ページSSLで保護されている場合はOn
#session.entropy_file
セッションIDを作成する時のエントロピーソースを指定
存在する場合は``/dev/urandom``
#session.gc_maxlifetime
セッションデータの生存時間を秒で指定
初期値は24分になっている
ただすぐに削除されるとは限らない
session.gc_probabilityとsession.gc_divisorの設定による確率で削除される
長くするとセッションハイジャックのリスクが高まる
#session.hash_function
セッションIDを生成するハッシュ関数を指定する
``MD5``は128ビット、``SHA1``は160ビットなのでビット数の多い分だけセッションIDの推定が難しくなるので安全性が上がる
#session.save_path
セッションファイルを保存するフォルダ
デフォルトでtmpになるが共有サーバーの場合は他のユーザーがセッションハイジャックする可能性がある
#session.use_cookies
Cookieによるセッション管理を行うかどうか
``必ずOnにする``
#session.use_only_cookies
URLによるセッション管理を禁止するかどうか
``必ずOnにする``
#session.use_trains_sid
透過的なセッションIDをするかどうか
``セキュリティ上の問題があるので0``
#まとめ
安全性を高めれば高めるほど制限が増えるので、ケースバイケースで変更するのがいいと思います！！