ファイルシステムのセキュリティ
PHP は、ファイルおよびディレクトリ毎に権限を設定する多くのサーバーシ
ステム上に組み込まれたセキュリティを提供します。これにより、ファイ
ルシステム内のファイルを読み込み可能に制御することが可能になります。
全てのファイルは世界中から読み込み可能であり、このファイルシステム
にアクセスした全てのユーザーから読み込まれても安全であることを確認す
る必要があります。
PHPは、ファイルシステムにユーザーレベルのアクセスを許可するように設
計されているため、PHPスクリプトから /etc/passwd のようなシステム
ファイルを読み込み可能としたり、イーサネット接続を修正したり、巨大
なプリンタジョブを出力したりすることができます。これから明らかにわ
かることですが、読み書きするファイルを適切に設定する必要があります。
各自のホームディレクトリにあるファイルを削除する次のスクリプトを見
てみましょう。これは、ファイル管理用にWebインターフェイスを使用す
る場合に通常生じるような設定を仮定しています。この場合、Apacheユー
ザはそのユーザーのホームディレクトリにあるファイルを削除可能です。
甘い変数の確認から生じるリスク
]]>
username および filename はユーザーフォームから投稿可能であるため、別の
username および filename を投稿して
削除すべきではない削除することが可能となります。この場合、
他の何らかの形式の認証を使用するべきです。投稿された変数が、
"../etc/" と "passwd" であった場合について考えてみましょう。簡単
なコードを以下に示します。
... ファイルシステムへの攻撃
]]>
こうした問題を防止するために必要な重要なチェック手段として以下の2
種類のものがあります。
PHP Webユーザーバイナリに制限された権限のみを許可する。
投稿された全ての変数を確認する。
以下に改良されたスクリプトを示します。
より安全なファイル名の確認
]]>
しかし、これでも、傷口を塞いだことにはなりません。
ユーザーが自分用のユーザーログインを作成することをあなたの認証システムが
許可しており、ユーザーが "../etc/" へのログインを選択した場合、システム
はまたも公開されてしまいます。このため、よりカスタマイズされたチェッ
クを行なう方がよいでしょう。
より安全なファイル名の確認
]]>
オペレーティングシステムによって、注意するべきファイルは大きく変化し
ます。これらには、デバイスエントリ(/dev/ または /dev/)、設定ファイル(/etc/ ファイルおよび .ini ファイル)、よく知られたファイル保存領
域 (/home/、My Documents)等が含まれます。このため、明示的に許可す
るもの以外の全てを禁止する方針とする方が通常はより簡単です。
Null バイト関連の問題
PHP はファイルシステム関連の操作に C 言語の関数を使用しているので、
null バイトの処理を予期せぬかたちで行うことがあります。
C 言語では null バイトは文字列の終端を表すので、
null バイトを含む文字列があった場合に
null バイト以降の内容は文字列として処理されません。
以下に、この問題に関する脆弱性を含むコード例を示します。
null バイトに対して脆弱なスクリプト
]]>
したがって、ファイルシステム操作で使用する「汚染された」文字列は、
つねに適切に検証しなければなりません。
先ほどの例を改良したものを示します。
入力を適切に検証する例
]]>