[PHP-users 10910] Re: 穴を作らないためのスクリプティング

Yasuo Ohgaki php-users@php.gr.jp
Thu, 17 Oct 2002 09:52:36 +0900


大垣です。

pg_convertの使い方はもう少し書いておきます。

Osamu Shigematsu wrote:
> エラー関数について、まだ全然使いこなせていないのですが、
> 参考になるコードなどありましたら、ご紹介頂けませんでしょうか。
> 5 までまだ少し時間があるかと思いますので。

コードよりどんな感じでやっているか方が短いので私の利用例を簡単
にご説明します。

エラーレベルをE_ALLに設定。
エラーハンドラをset_error_handler()で変更。
スクリプトの一番最初にob_start()でバッファリングを開始。

エラーチェックコードでエラーが発生した場合はtrigger_error()
でエラーを発生 -> エラーハンドラを呼ぶ。

エラーハンドラはバッファリングされた出力を削除(ob_end_clean())
し、エラーレベル/エラーの内容に応じて、システム/プログラムエラー
のページ等を表示。

と言った感じです。

エラーハンドラの登録はset_error_handler()のマニュアルページ
のサンプルがよくできているので省略します。

エラー処理時にはあまりパフォーマンス関して考える必要がないので
(DoSは必ず考慮する必要あり)エラーハンドラでは比較的時間がかか
る処理も行ないます。たとえば、多くの正規表現を使ったエラーメッセー
ジの比較処理なども行ないます。DoSが気になる場合は、エラー発生時
にエラー処理サーバーにリダイレクトして、エラー処理自体を別サーバー
で行なう必要がある場合もあります。

プログラム作成時に、普通の操作では絶対にエラーが発生しないように
コーディングし「全てのエラー = プログラムエラーまたはユーザーに
よるおかしな操作」とする事によりプログラムが非常にシンプルになり
ます。

PHPのプログラム全体がtryブロック、trigger_errorでthrow、
エラーハンドラでcatchと言った感じですね。

> 
>> 色々考えてプログラム作らないと簡単に大穴付きのWebサイトに
>> なってしまいます。たとえば、以下のスクリプトは非常に危険です。
>>
>> 当たり前すぎて、役に立たないかもしれませんが、セキュリティー
>> 上の問題点、すぐに解りますよね?
> 
> 
> んでもって、それはそうなんですが、こういう穴を共用の計算機の場合、
> すっとぼけた他人があけないとも限らないわけで、
> だとすると、PostgreSQL に接続する際のパスワードとか、
> どこに書けばいいのよ、という疑問がふつふつと湧いてくるのですが、
> どのような方策が考えられますでしょうか。

CGIでない場合、ディレクトリ単位で環境変数を使う、と言う方法
がよいと思っています。

.htaccessのファイル所有者をroot, ファイルグループにWebサーバー
のGIDを追加、モードを640で他の人から見られません。

# PHP関数から見れるので、safe_modeかopen_basedir
# を使う必要があります。safe_modeかopen_basedirを
# 使う時点で完全ではないのですが...

safe_modeを使ってパスワードが書いてあるスクリプトに同様の事ができ
ます。

これでは困る、と言う場合は別途専用サーバーを用意して、安全性を確保
するしかないと思います。

--
Yasuo Ohgaki