パスディスクロージャとエラーレポート設定

パスディスクロージャはPHPスクリプトのフルパスがエラーレポートによって出力されてしまう性質を利用した攻撃のことを言います。意図的にエラーを発生させて、取得した情報を元に他の攻撃を受けることがあります。ただし、エラーレポートは本来、デバッグや開発の際に必要となるものです。

パスディスクロージャの対処法

デバッグや開発終了時にphp.iniでerror出力をオフもしくは0にします。エラーレポートは開発を補助するシステムであり、公開時に使用するものではありません。

パスディスクロージャ対策:開発時における対処例

error_reportingで「E_ALL」を指定するとサポートされる全てのエラーと警告を表示します。phpiniでは「|」「~」「!」「^」「and」「&」を解釈するため、指定する値を組み合わせたりマスクすることができます。

display_startup_errorsは、「1」を指定するとPHPの起動シーケンスで発生したエラーを表示します。このエラー表示は、display_errorsとは別扱いとなります。

display_errorsは、「1」を指定するとエラーをHTMLの一部として画面に出力します。

パスディスクロージャ対策:公開もしくは本番環境での設定

display_startup_errors = 0
display_errors = 0

パスディスクロージャ対策:PHPファイルに直接ini_set()を使って対処

レンタルサーバの場合は、管理パネル上からerrorログを閲覧できることが殆どですが、ini_set()を使うことで特定のPHPファイルのエラーを他の場所に移動させて保存することができます。その場合、保存先はディレクトリ構造でのフルパスを指定し、その中に存在しないフォルダを指定している場合は作成してアップロードします。エラーファイルのほうは、存在しなければサーバのほうで自動的に作成されます。ただし、ini_set()ではなくphpiniに直接ログファイルの保存先を指定した場合、サーバ設定によっては反映されません。

ini_set('display_startup_errors', 0);
ini_set('display_errors', 0);
// ログファイルにerrorを保存する場合は追記
ini_set('log_errors', 1);
ini_set('error_log', '/ログファイルへのフルパス');

パスディスクロージャ対策:.htaccessに記述して対処

レンタルサーバですと、.htaccessではphp_flagを使えないケースがあります。以下のコードを設定してサイトにアクセスするとおそらく500errorが表示されます。その場合、phpiniを使った方法で設定します。

php_flag display_startup_errors Off
php_flag display_errors off
# ログファイルにerrorを保存する場合は追記
php_flag log_errors on
php_value error_log "/ログファイルへのフルパス"