PHP のエラーメッセージの表示に関する脆弱性について

WordPress など PHP で作られた Web サイトに、以下のようなエラーが表示されていることを見たことがおありでしょうか。

Warning: Use of undefined constant WP_DEBUG - assumed 'WP_DEBUG' (this will throw an Error in a future version of PHP) in /var/www/vhosts/xxxxxx.jp/wp-config.php on line 80

このようなメッセージが表示されることにはいくつかの問題があります。

エラー内容が表示されることの問題点

1.XSS脆弱性の存在を露呈して利用されてしまう

例えば、フォームのラジオボタンなどからの入力内容を、サーバー側でそのままハッシュのキーに使っている場合、XSS 脆弱性が露呈してしまいます。

値を何らかの JavaScript に改ざんされると、それはそのままサーバー上で実行されてしまいます。
エラーメッセージが表示されるときにはエスケープされないからです。

「入力値をそのままハッシュのキーに使うことなんてわるわけが無いじゃないか」とお思いの方もおられると思いますが、このラジオボタンの値をサーバー側で定義していると、サーバー側とクライアント側で値が常に同じ、という錯覚に陥りがちですし、とにかくこのケースは単に例です。

入力値をエスケープするのはもちろんですが、まずハッシュのキーとして存在するのかチェックするのが常道だと思います。

2.何らかの脆弱性が存在することを類推されてしまう

例えば、「このエラーが出るのであれば、プログラムの作りはこのようになっているはず」など類推され、脆弱性に関するヒントを与えてしまう場合があります。

また、これはエラーメッセージだけに限らないのですが、「このエラーが出るのはあのパッケージのこのバージョンなので、この脆弱性があるはず」という類推もあり得ます。

そのようなパッケージとバージョンは他の情報からも類推が可能ば場合がほとんどですが、エラーメッセージが表示されていると、そのエラーメッセージが検索エンジンにインデックスされてしまいます。

攻撃者は単に Google でエラーメッセージを検索するだけで脆弱性を含む攻撃対象の候補を見つけ出すことができてしまいます。

3.ディレクトリのパスが露呈してしまう

これは厳密には脆弱性ではありません。

ディレクトリトラバーサル脆弱性に関するヒントを与えてしまう可能性はあります。しかし、Web の公開ディレクトリのパスのパターンは大抵似通っており、ディレクトリが分かること自体が何か攻撃者の助けになるとは考えにくいと思います。

パスにユーザー名が含まれている場合があり、それがイヤだな、という方はおられるかもしれません。

また、レンタルサーバーによってはユーザー名を使ったメールアドレスを自動的に生成する、余計なお世話なレンタルサーバーも存在しますので、見えない方が良いのは間違いがありません。

ではどうするか

本番環境ではエラーメッセージが表示されないように、php.ini などで display_errorsoff に設定します。

ほとんどのサーバーでは php.ini の一部を変更できるようになっていますので、サーバーの管理画面を確認してみてください。

php.ini 変更できない場合にも、php の ini_set() や .htaccess で設定することも可能です。
(.htaccess での設定に制約がある場合もあります)