Help us understand the problem. What is going on with this article?

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

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

まとめ

安全性を高めれば高めるほど制限が増えるので、ケースバイケースで変更するのがいいと思います!!

satorunooshie
経済学を学んでいる大学三年生です PHP, Kotlinを中心に学習しています 役に立てそうな英語の記事や詰まったところを共有していきます
https://satorunooshie.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away