PHPセキュリティ

Last-modified: 2007-08-06 (月) 01:11:56

情報源

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エンコードされている文字列をダブルエンコードしなくなる。

つまり、&quote; を &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()

暗号

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 が同じであればアクセスが許可される。通常はこっちで十分とのこと。