49

PHP Web サイトでは、彼らが提案する唯一の実際のチェックは、is_uploaded_file()ormove_uploaded_file()を使用することです。もちろん、さまざまな理由から、通常、ユーザーがどのような種類のファイルをアップロードすることも望ましくありません。

このため、私は「厳密な」MIME タイプ チェックをよく使用してきました。もちろん、多くの場合、MIME タイプが間違っていて、ユーザーがファイルをアップロードできないため、これには大きな欠陥があります。また、偽造および/または変更も非常に簡単です。それに加えて、各ブラウザーと OS は、それらを異なる方法で処理します。

もう 1 つの方法は、拡張子を確認することです。もちろん、これは MIME タイプよりも簡単に変更できます。

画像だけが必要な場合は、次のようなものを使用するとうまくいきますgetimagesize()

他の種類のファイルはどうですか? PDF、Word文書、またはExcelファイル? それともテキストのみのファイルですか?

編集: mime_content_typeまたはFileinfoがなく、system("file -bi $uploadedfile") で間違ったファイル タイプが返される場合、他にどのようなオプションがありますか?

4

7 に答える 7

33

mime_content_typeまたはFileinfoを見てください。これらは、ファイルの内容を見てファイルの種類を判断する組み込みの PHP コマンドです。上記の 2 つのページのコメントも確認してください。他にも良い提案がいくつかあります。

個人的には、本質的に何かを使用して幸運に恵まれましたがsystem("file -bi $uploadedfile")、それが最善の方法かどうかはわかりません。

于 2008-11-22T02:13:09.677 に答える
15

私見、すべての MIME タイプのチェック方法は役に立ちません。

MIME-type を持つ必要があるものがあるとしますapplication/pdf。標準的な方法では、PDF ヘッダーのようなもの (またはそのようなもの) を見つけようとしており%PDF-、成功すると「わかりました。これは PDF ファイルのようです」というメッセージが返されます。しかし、実際にはこれは何の意味もありません。のみ%PDF-1.4を含むファイルをアップロードすると、MIME チェックに合格します。

つまり、ファイルに期待される MIME タイプがある場合、常に MIME タイプ チェックに合格します。それ以外の場合、結果は未定義です。

于 2008-12-16T07:54:04.160 に答える
2

受け入れるファイルタイプの固定ホワイトリストがあると思います。

これらのタイプごとに、さまざまな手法を使用して、それらがその形式の有効な例であることを確認する必要があります。

関連する質問が 2 つあります。

  • おおむね正しいタイプのように見えますか?(JPEGの場合は、前述のようにヘッダーを確認できます。多くのUnixベースの形式では、「マジッククッキー」を確認できます。)

  • それは実際にそのタイプの有効な例ですか (たとえば、XML のような形式の場合は、DTD に対して検証できます)。

PDF と ZIP ファイルでは回答が大きく異なるため、形式ごとに個別に質問する必要があると思います。

于 2008-11-22T02:03:37.637 に答える
2
if(isset($_FILES['uploaded'])) {
    $temp = explode(".", $_FILES["uploaded"]["name"]);

    $allowedExts = array("txt","htm","html","php","css","js","json","xml","swf","flv","pdf","psd","ai","eps","eps","ps","doc","rtf","ppt","odt","ods");

    $extension = end($temp);
    if( in_array($extension, $allowedExts)) {
       //code....

    } else {
        echo "Error,not Documentum type...";
    }
}
于 2014-06-20T13:10:04.570 に答える
2

PHP 5.2 と互換性のある mime_content_type を使用しました。これは、プロバイダーによって無効にされているFileinfo(PHP 5.3 が必要) も も使用できないためです。system()たとえば、ファイルがテキスト ファイルかどうかを確認します。

if (strcmp(substr(mime_content_type($f),0,4),"text")==0) { ... }

http://www.galgani.it/software_repository/index.phpの「PHP ディレクトリとサブディレクトリ リスナー & ファイル ビューアーとダウンローダー」で完全な例を確認できます 。

于 2012-03-18T23:47:51.610 に答える
1

file_mime_typeiZendの関数は次のとおりです。

function file_mime_type($file, $encoding=true) {
    $mime=false;

    if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME);
        $mime = finfo_file($finfo, $file);
        finfo_close($finfo);
    }
    else if (substr(PHP_OS, 0, 3) == 'WIN') {
        $mime = mime_content_type($file);
    }
    else {
        $file = escapeshellarg($file);
        $cmd = "file -iL $file";

        exec($cmd, $output, $r);

        if ($r == 0) {
            $mime = substr($output[0], strpos($output[0], ': ')+2);
        }
    }

    if (!$mime) {
        return false;
    }

    if ($encoding) {
        return $mime;
    }

    return substr($mime, 0, strpos($mime, '; '));
}
于 2013-06-27T17:17:54.333 に答える