上へ

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

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

対処法

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

開発時のphp.iniにおける設定例

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

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

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

公開もしくは本番環境でのphp.ini設定

display_startup_errors = 0
display_errors = 0

PHPファイルに直接ini_set()を使ってphp.ini設定

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

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

.htaccessに記述してphp.ini設定

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

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