自分が実際の案件で使う際の雛形用にメモ。あくまでも雛形なので、必要に応じて追加変更削除は必要になると思います。
.htaccess
ではなく、httpd.conf
などで設定するのも勿論有効です。
他にも含めておくといい設定はありそうなので、随時更新することになるかも。
#.htaccessの設定内容
Options -Indexes
DirectoryIndex index.php
Header set X-XSS-Protection "1; mode=block"
Header set X-Frame-Options DENY
Header set X-Content-Type-Options nosniff
<Files ~ "\.(log|ini)$">
Deny from all
</Files>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1
</IfModule>
php_flag register_globals Off
php_flag magic_quotes_gpc Off
php_value default_charset UTF-8
php_value mbstring.language Japanese
php_value mbstring.internal_encoding UTF-8
php_value mbstring.input_encoding pass
php_value mbstring.output_encoding pass
php_value mbstring.substitute_character none
php_flag session.use_trans_sid Off
php_flag session.use_cookies On
php_flag session.use_only_cookies On
php_flag session.cookie_httponly On
php_flag session.auto_start Off
php_value session.cache_limiter none
php_value session.gc_divisor 1000
php_value session.gc_maxlifetime 10800
php_value session.gc_probability 1
php_value error_reporting 2047
php_flag display_errors Off
php_flag display_startup_errors Off
php_flag log_errors On
php_value error_log "/path/to/error.log"
#設定内容補足
##ファイル一覧の設定
Options -Indexes
ファイル名を省略してディレクトリにアクセスした場合、index.html
などが無くてもファイル一覧を表示しません。
DirectoryIndex index.php
ファイル名を省略してディレクトリにアクセスした場合、index.php
があればそのファイルを表示します。
##不正アクセス対策の設定
Header set X-XSS-Protection "1; mode=block"
ブラウザのXSSフィルターを有効化し、XSSによる攻撃を緩和します。
Header set X-Frame-Options DENY
クリックジャンキング対策に、ページをフレーム内に表示することを禁止します。
同じサイトからの読み込むを許可する場合、DENY
をSAMEORIGIN
に変更します。
Header set X-Content-Type-Options nosniff
IEがHTML以外のファイルをHTML扱いすることを防ぎます。(IE8以降で有効)
##ファイルアクセスの設定
<Files ~ "\.(log|ini)$">
Deny from all
</Files>
拡張子がlog
・ini
のファイルへの直接アクセスを禁止します。
##mod_rewriteの設定
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1
</IfModule>
http://www.example.com/index.php/view/5
のようなURLに、http://www.example.com/view/5
のようなURLでアクセスできるようにします。
##PHPの動作設定
php_flag register_globals Off
想定外の変数に値が格納されないようにします。
php_flag magic_quotes_gpc Off
入力データが自動的にエスケープされないようにします。エスケープ処理は、必要に応じて各プログラム側で行います。
##文字コードの設定
php_value default_charset UTF-8
php_value mbstring.language Japanese
php_value mbstring.internal_encoding UTF-8
php_value mbstring.input_encoding pass
php_value mbstring.output_encoding pass
php_value mbstring.substitute_character none
デフォルトの文字コードをUTF-8に設定します。(文字化け対策&UTF-7 XSS 対策。)
##セッションの設定
php_flag session.use_trans_sid Off
php_flag session.use_cookies On
php_flag session.use_only_cookies On
php_flag session.cookie_httponly On
php_flag session.auto_start Off
セッションをCookieでのみ扱うようにします。(セッションハイジャック対策。)
php_value session.cache_limiter none
php_value session.gc_divisor 1000
php_value session.gc_maxlifetime 10800
php_value session.gc_probability 1
セッションの有効期限を設定します。(期限は一例。10800
は3時間。)
##エラー出力の設定
php_value error_reporting 2047
php_flag display_errors Off
php_flag display_startup_errors Off
php_flag log_errors On
php_value error_log "/path/to/error.log"
PHPプログラムのエラー情報をブラウザに表示せず、error.log
へ出力するように設定します。(パス情報や脆弱性情報の漏洩対策。)
error_log
は記録したいファイルへのパスを設定します。
.htaccess
ではエラーレベルを定数で指定できないので、上のように数値で指定します。以下は定数と数値の比較です。必要ならば、表を参考にしてエラーレベルを変更します。
定数表現 | 数値表現 |
---|---|
E_ALL | 2047 |
E_ALL & ~E_NOTICE | 039 |
E_ALL | E_STRICT | 4095 |