[PHP-users 9647] Re: ファイルの存在確認をしたい

Yasuo Ohgaki php-users@php.gr.jp
Fri, 30 Aug 2002 19:19:42 +0900


大垣です。

蛇足なので説明不足でも良いか、と思っていたのですが、せっかくな
ので追加します。

@ Edwin wrote:
> 
> Yasuo Ohgakiさんwrote:
> 
>> # 蛇足ですが、もしWriting Solid PHP Codeという本
>> # あればE_ALLでコーディングしましょう、と書いてあると
>> # 思います。E_ALLでエラーが発生しないように開発する
>> # 事は安全なWebアプリケーションを作る上で非常に重要です。
> 
> 
> 確かに、努力は必要です。が、今、現在、(今まで)人間が作った完璧なものっ 
> てあ
> りますか?「エラーが発生しないように」開発しても、いつか、どこかで、エ 
> ラーが
> 出てくると思います。また、(1)「バグ」というものがあるのではないでしょう
> か?(2)自分がどんな努力をしても、サーバーや回線や他のソフト(アプリケー
> ション)の問題があったら、エラーが発生します。(例:自分で作ったPHPアプリ
> ケーションが他のFTPサーバーやDBサーバーやWeb Applicationサーバーに接続し 
> てい
> る間に急に問題が発生したら、エラーが発生するのではないでしょうか?)

エラーにもいろいろ種類がありますが、ほかのサブシステムがクラッシュ
したり、ユーザーが予期しないデータを送信したりする事はよくある事で
す。

より安全でエラーに強いWebサイトを作る為には

1. E_ALLでエラーフリーなスクリプトを書く
2. user_error_handlerを定義しどのようなエラー発生時にも
   適切なエラーページ表示する
3. エラーカウンタを設けておいて、閾値以上のエラーが発生したら
   常にエラーページを表示する

ように作る事が望ましいと考えています。
エラーは開発者が意図しない使い方やテスト洩れの部分で発生します。
サブシステムがおかしくてエラーになったか、クラッカーからの攻撃で
エラーになったか記録しておく事が大切です。また、余計な情報はクラッ
カーに与える必要はないのでエラーが発生した場合はエラーで正常に
表示できなかったページを表示するのではなく、用意されたエラーページ
を表示する事が重要と考えています。

Writing Solid Code(Microsoft Press)は8か9年程前に読んだ
本ですが、私のお気に入りの本の一つです。比較的ボリュームも少ないの
ですぐに読みきれます。Cプログラマにはお勧めです。

> 
> PHPの開発者たちはなぜ「@」エラー制御オペレータを使えるようにPHPを開発し 
> たのですか?また、php.iniの中にこういう「注意書き」もあります:

いつからあったのか知りませんが、不適切に書かれたコードを利用
しなければならない場合には便利です。:) しかし、利用はお勧め
しません。 好ましくない機能/仕様のうちの一つと思います。

> 
> <snip>
> ; Print out errors (as a part of the output).  For production web sites,
> ; you're strongly encouraged to turn this feature off, and use error 
> logging
> ; instead (see below).  Keeping display_errors enabled on a production 
> web site
> ; may reveal security information to end users, such as file paths on 
> your Web
> ; server, your database schema or other information.
> display_errors = Off
> </snip>
> 
> なぜ「エラーを表示しないようにOFFにしてください」という提案が書いてあるので
> すか?考えられる理由ってたくさんありますが、ひとつだけ言いたいと思います。
> 「完璧なもの」って*私*は作りませんから。
> 
> PHPの開発者たちがエラーを表示しない方法を与えてくれたことはありがたいことで
> す。

皆さん、運用しているサーバーでエラーを表示しない方が良い事はご存知
ですよね?エラー情報はアタックを行なう際、例えばSQLインジェクショ
ンなどを行なう時に非常に役に立ちます。

運用時には
error_reporting=E_ALL
display_errors=Off (エラーハンドラがあるとエラーメッセージは表示しませ
んが...
log_errors=On
output_buffer=On (or zlib_output_compressoin=On)
カスタムエラーハンドラでエラー発生時に用意されたエラーページを表示

開発時には
error_reporting=E_ALL
display_errors=On
log_errors=On
エラーハンドラ無し

で開発すると良いと思います。

# エラー発生後に任意のエラーページを表示するにはアウトプットバッ
# ファー必要ですが4.2.xより古いPHPでob_end_*()/
# ob_implicit_flush()でアウトプットバッファーを終了させる
# と予期しない動作をする事があります。古いPHPを使っている場合は
# 注意が必要です。説明すると長くなるので気になる方は4.2.2を使っ
# てください。
# アウトプットバッファーのコードを改良していたのはこのバグを直す
# 為だったのです。このバグには結構苦しめられました... :(

--
Yasuo Ohgaki