情報源
CGIインタプリタ形式では使わない
- suExecしたりできるが、設定ミスのときのリスクが大きい。
- 速度が遅くなる。
インタプリタ形式は、PHP本来の使い方ではないため、
Apacheのモジュール形式でインストールすべき。
型キャスト
- (int), (integer)
- (bool), (boolean)
- (float),(double),(real)
- (string)
- (binary)
- (array)
- (object)
色々あるが、intへのキャストが使えそう。特殊文字が入らなくなる。
intval() は、引数を int 型に変換して返すので、これを使える。
HTMLエンコード
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode]]] )
- quote_style の設定
- 何もなし (ダブルクォートのみ変換)
- ENT_COMPAT (ダブルクォートのみ変換)
- ENT_QUOTES (ダブルクォート、シングルクォートどちらも変換される)
- ENT_NOQUOTES (ダブルクォート、シングルクォートどちらも変換されない)
- charset の設定
- (省略)
- double_encode の設定
double_encode を false にすると、既にHTMLエンコードされている文字列をダブルエンコードしなくなる。
つまり、"e; を &quote; に変換しなくなる。
フィルタ拡張モジュール
自動的にエンコードするように設定できるらしい。
古いグローバル変数は使わない(なるべく?)
- $HTTP_SERVER_VARS
- $HTTP_ENV_VARS
- $HTTP_COOKIE_VARS
- $HTTP_GET_VARS
- $HTTP_POST_VARS
- $HTTP_POST_FILES
- $HTTP_SESSION_VARS
register_globals
php.ini の設定。4.2.0 以降では、デフォルトOFFになっている。
EGPCS(Environment, GET, POST, Cookie, Server)変数を、外部から設定可能とするかどうかの設定。
非常に危険であるため、必ずOFFに設定しておくべき。6.0.0 では、設定項目から削除されている。
入力値のチェック
- ctype_alnum()
- preg_match()
暗号
- md5()
- mhashライブラリ
php.ini の設定
php.ini の設定は、httpd.conf や .htaccess から設定できるものもある。(.htaccess は、PER_DIRの場合だけ?)
expose_php
レスポンス内に X-Powered-By を出すかどうかの設定。Off にすると出なくなる。
PHPマニュアルには「これは全くセキュリティ上の脅威ではなく」と書いてあるが、
セキュリティ対策としては、表示しないようにするのが鉄則。
memory_limit
スクリプトが使用可能なメモリ上限。デフォルトでは 16M(>= 5.2.0)や 8M(< 5.2.0)と
設定してある。「-1」を指定すると制限無しになるが、サーバ停止の原因となるので、
分からない場合は変更すべきでない。
register_globals
EGPCS(Environment, GET, POST, Cookie, Server)変数をグローバル変数にするかどうかの設定。
グローバル変数にしてあると、外部から設定できてしまうため、非常に危険。
デフォルトでは Off となっており、この設定は必ず Off となっているべき。
post_max_size
POSTデータの最大長。upload_file_size より大きくする必要がある。
デフォルト値は 8M (5.1.6の場合)。
以下のサイズ関係となるように設定しなければならない。
memory_limit >= post_max_size >= upload_file_size
デフォルト値は 8M だが、全体としての最大値はこれでいい気がする。
BOF対策は個別のアプリケーションで行うべき。
auto_prepend_file
自動的に読み込まれるファイルを指定する。フィルタ系のアプリケーションをここで設定できる。
ディレクトリごとに自動的に設定できるため、「none」に設定し、無効化しておくほうがいいかもしれない。
auto_append_file
自動的に読み込まれるファイルを指定する。prepend と違い、後処理として実行される。
ディレクトリごとに自動的に設定できるため、「none」に設定し、無効化しておくほうがいいかもしれない。
default_charset
デフォルトの文字コードをセットしておき、開発時はこのコードに合わせるべき。
allow_webdav_methods (< 4.3.2)
PHPスクリプト内でWebDAVメソッドを使う場合に設定するのだが、Webサーバ側でできるだろうから、普通にWebDAVを使うだけなら、PHPの設定でやる必要はない。
enable_dl
dl()で、動的に拡張ライブラリ(xxx.so、xxx.dll)を読み込むことは問題発生時の被害が大きくなるため、無効とすべき(デフォルトでは無効)。PHP5では、extension ディレクティブを使えば、自動的にロードしてくれる。
safe_xxxx
セーフモードに関する設定。適切に設定する必要がある。後述の「セーフモードの使用」を参照。
open_basedir
スクリプト内からオープンするディレクトリの制限。
disable_functions
特定の関数の使用を禁止する。たとえば、system() とか。
disable_classes
特定のクラスの使用を禁止する。たとえば何?
セーフモードの使用
- safe_mode
- safe_mode_gid
safe_mode の場合は、owner が同じファイルに対するアクセスしか許可されない。
safe_mode_gid の場合は、group が同じであればアクセスが許可される。通常はこっちで十分とのこと。