ファイルがアップロードできるということは、ユーザはさまざまな形式のデータをアップロードし、データをコントロールできるということですね。
普通のテキスト入力でも考慮すべきことですが、ファイルのアップロードとなると、さらに気をつけるべき点ですね。
まず第一に、全て信用するなということです。
・ファイルデータ
・ファイル名
・MIMEタイプ
の3つがファイルの大きな要素ですが、どれも信用できません。
1.$_FILES['file']['type']のMIMEタイプは信用してはいけません。ユーザ任意です。
2.ファイル名をそのまま使ってはいけません。これもユーザ任意の値です。
ファイル拡張子もファイル名もそもそも信用してはいけません。
また、サーバのハードディスクに'dir/' . $_FILES['file']['name']のようにファイルを保存してはいけません。
もし、'../../../passwd'だった場合、別のディレクトリのファイルを上書きするとこになります。
常にランダムな名前を生成し、それで保存しましょう。メタデータとしてオリジナルのファイル名を格納することもできます。
3.ファイルへ任意にアクセスされないようにしましょう。
例えば、攻撃者がmalicious.phpファイルをサーバにアップロードしあなたのwebrootディレクトリに格納したとしましょう。
攻撃者は簡単にexample.com/uploads/malicious.phpにアクセスしてファイルを起動し、
任意のPHPコードをサーバで実行できてしまいます。
・任意にアップロードされたファイルをパブリックに格納しないこと。あなただけがアクセスできるところに格納しましょう。
・ファイルへのアクセスは制限すること。
もし画像ファイルでしたら、ファイルディレクトリへのアクセスは画像を読み込んでサイズ変更するスクリプトだけ許可しましょう。
もし、そのスクリプトがファイルを読み込めないのであれば、画像ファイルではないということです。フラグを立てて、削除しましょう。
他のタイプのファイルでも同様です。
他のユーザによってダウンロードできるようにするのならば、ダウンロードしかできないようなスクリプトにしましょう。
・どのファイルタイプになるかわからない場合は、ファイルのMIMEタイプを調べてファイルを開く特定のプロセスを用いましょう。
もしそのプロセスが脆弱だと、悪質なファイルによってセキュリティ違反につながります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。