6

私はファイルアップロードスクリプトを作成していて、アップロードされたファイルを検証するための最良のテクニックとプラクティスを探しています。

許可される拡張機能は次のとおりです。

$allowed_extensions = array('gif','jpg','png','swf','doc','docx','pdf','zip','rar','rtf','psd');

これが私がしていることのリストです。

  1. ファイル拡張子を確認しています

    $path_info = pathinfo($filename);
    if( !in_array($path_info['extension'], $allowed_extensions) ) {
        die('File #'.$i.': Incorrent file extension.');
    }
    
  2. ファイルのmimeタイプを確認しています

    $allowed_mimes = array('image/jpeg','image/png','image/gif','text/richtext','multipart/x-zip','application/x-shockwave-flash','application/msword','application/pdf','application/x-rar-compressed','image/vnd.adobe.photoshop');
    if( !in_array(finfo_file($finfo, $file), $allowed_mimes) ) {
        die('File #'.$i.': Incorrent mime type.');
    } 
    
  3. ファイルサイズを確認しています。

アップロードされたファイルが有効なファイルであることを確認するにはどうすればよいですか?奇妙なことに気づきました。.jpgファイル拡張子を.zipに変更して...アップロードしました。MIMEタイプが正しくないと思いましたが、その後、特定のタイプをチェックしていないことに気付きましたが、特定のMIMEタイプが配列に存在するかどうかを確認しました。後で修正しますが、問題はありません(もちろん、良い解決策やアイデアがあれば、遠慮なく共有してください)。

画像の扱い方(サイズ変更、回転、切り抜きなど)は知っていますが、他の拡張機能を検証する方法がわかりません。

今が私の質問の時間です。

  1. そのようなファイルを検証するための優れたテクニックを知っていますか?.zip / .rarファイルのアーカイブを解凍する必要があるかもしれませんが、ドキュメント(doc、pdf)はどうですか?
  2. .psdファイルのローテーション、サイズ変更は機能しますか?
  3. 基本的に、.psdファイルには次のMIMEが含まれていると思いました:application / octet-stream

表示された.psdファイル(image / vnd.adobe.photoshop)をアップロードしようとしました。私はこれについて少し混乱しています。ファイルは常に同じMIMEタイプを持っていますか?

また、コードブロックを強制的に機能させることはできません。誰かが理由について推測していますか?

4

2 に答える 2

5

多くのファイル形式には、形式を示すためのかなり標準的な開始バイトのセットがあります。最初の数バイトに対してバイナリ読み取りを実行し、既知の形式の開始バイトに対してそれらをテストする場合、ファイルタイプが拡張子と一致することを確認するためのかなり信頼できる方法であるはずです。

たとえば、JPEGの開始バイトは0xFF、0xD8です。だから次のようなもの:

$fp = fopen("filename.jpg", "rb");
$startbytes = fread($fp, 8);
$chunked = str_split($startbytes,1);
if ($chunked[0] == 0xFF && $chunked[1] == 0xD8){
    $exts[] = "jpg";
    $exts[] = "jpeg";
}

次に、内線に対してチェックします。

動作する可能性があります。

于 2010-08-20T22:24:22.417 に答える
4

画像を検証する場合は、getimagesize()を使用して、有効なサイズのセットが返されるかどうか、または無効な画像ファイルの場合はエラーになるかどうかを確認することをお勧めします。または、サポートしようとしているファイルに対して同様の機能を使用します。

重要なのは、ファイル名はまったく意味がないということです。ファイル拡張子(.jpgなど)、mimeタイプ...は人間用です。

ファイルが正しいタイプであることを保証できる唯一の方法は、ファイルを開いてバイトごとに評価することです。つまり、多数のファイルタイプを検証しようとする場合、明らかに非常に困難な作業です。最も単純なレベルでは、ファイルの最初の数バイトを調べて、そのタイプのファイルに期待されるものと一致していることを確認します。

于 2010-08-20T22:19:07.110 に答える