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をローカルファイルと同じように読み込むことができる |
file_get_contents('https://satorunooshie.net');
しかしPHP5.2よりも前の場合はinclude
やrequire
などでも外部URLを読み込めるためインクルード攻撃を受ける可能性がある
PHP5.2以降ではallow_url_includeに分けられた
インクルード攻撃は
include $_GET['text'];
のようにすると攻撃者が自由にサーバー上でコードを実行することができるようになるらしい
またinclude
文の引数にユーザーの入力値を含まない場合でも
ファイルの中身がブラウザから確認できる場合、インクルードファイルの流出によって攻撃の手がかりを与えることになるので注意
インクルードファイルをドキュメントルートよりも上に配置すれば大丈夫
#allow_url_include
Offのままで良い、理由は前述
#default_charset
HTTPヘッダーでの文字エンコードの指定
指定しない場合XSSの危険性があるのでUTF-8
に指定する
特定のページのみ変更する場合はini_set()
関数かheader()
関数を使う
#disable_functions
無効にする内部関数の設定
コーディング規約などで利用を禁止している場合や危険な関数を利用しない場合に設定する
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で削除された
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
#まとめ
安全性を高めれば高めるほど制限が増えるので、ケースバイケースで変更するのがいいと思います!!