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

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