リソースの場所を考えてみる@PHP技術
先のファイルアップロード攻撃の対策について、画像掲示板が作れないという指摘を受けましたので、改めて考えてみました。
ファイルアップロード攻撃では、公開フォルダをDocumentRoot下に置いてあり、アクセスされて直接閲覧されるのを防ぐためにランダムにファイル名を変えて対処しました。
しかし、この方法では画像のファイル名がわからず、アップロードされたファイルを動的に参照できない問題(DBなどでファイル名を保持すれば対応出来ますが、対処法としては微妙)があり、改めて考えてみました。
まず、問題点として
- Documentroot下に公開フォルダがある。アップロードしたファイルに直接アクセスできる
- ファイル名をランダムに変えても運が良ければアクセスできる。
- 万が一エラーが起こった場合、ディレクトリ内部構成が現れてしまう
- 後から問題を覆いかぶせる対策では煩雑になり、漏れが出やすい
要するに、ファイルへアクセスするためのパスを知られてしまうのが一番の問題(間接的に別の攻撃を助ける可能性がある)
→そもそも、(設計上)直接アクセスできないようにするのが好ましい
→対策が煩雑になる前に設計段階で対処しておく必要がある
そこで、画像掲示板を例に考えてみました
- DocumentRoot外にimage(画像フォルダ)を作成する。
- 画像を参照したい場合は、スクリプト側で固定してimageディレクトリを参照させる
- ユーザーの入力からは参照させない。させる場合は適切な対処を行う
- DocumentRoot以下にはindex.php以外のファイルorディレクトリを置かない
- mod_rewriteで設定すると便利
- UNIXならファイル周りの権限を限定する
こうすると簡単にはHTTP経由で直接アクセスされなさそうです。