ApacheでPHPを使用する場合の.htaccess

  • 4
    Like
  • 0
    Comment

自分が実際の案件で使う際の雛形用にメモ。あくまでも雛形なので、必要に応じて追加変更削除は必要になると思います。
.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

クリックジャンキング対策に、ページをフレーム内に表示することを禁止します。
同じサイトからの読み込むを許可する場合、DENYSAMEORIGINに変更します。

Header set X-Content-Type-Options nosniff

IEがHTML以外のファイルをHTML扱いすることを防ぎます。(IE8以降で有効)

ファイルアクセスの設定

<Files ~ "\.(log|ini)$">
    Deny from all
</Files>

拡張子がloginiのファイルへの直接アクセスを禁止します。

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