8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

vpsでやっているとphp.iniの設定で苦しめられることがあるので、
備忘録としてまとめておきます
よかったら参考にしてください
#目次
忙しい方のための推奨設定一覧
allow_url_fopen
allow_url_include
default_charset
disable_functions
display_errors
enable_dl
expose_php
file_uploads
log_errors
magic_quotes_gpc
max_execution_time
max_input_time
memory_limit
register_globals
safe_mode
session.cookie_httponly
session.cookie_lifetime
session.cookie_secure
session.entropy_file
session.gc_maxlifetime
session.hash_function
session.use_cookies
session.use_only_cookies
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よりも前の場合はincluderequireなどでも外部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.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
#まとめ
安全性を高めれば高めるほど制限が増えるので、ケースバイケースで変更するのがいいと思います!!

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?