60

ファイル拡張子がアップロードされているかどうかを確認します。私の例のメソッドは機能しましたが、(を使用して)私のメソッドpathinfoが真であるかどうかを理解する必要があります。別のより良い、より速い方法はありますか?

$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if ($ext !== 'gif' || $ext !== 'png' || $ext !== 'jpg') {
    echo 'error';
}
4

10 に答える 10

158

) の使用if( $ext !== 'gif'は効率的ではない場合があります。20 種類の拡張機能を許可するとどうなりますか?

試す:

$allowed = array('gif', 'png', 'jpg');
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if (!in_array($ext, $allowed)) {
    echo 'error';
}
于 2012-05-04T21:09:03.687 に答える
64

ファイル拡張子を確認することは、ベスト プラクティスとは見なされません。このタスクを実行するための推奨される方法は、ファイルのMIME タイプをチェックすることです。

PHP から:

<?php
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // Return MIME type
    foreach (glob("*") as $filename) {
        echo finfo_file($finfo, $filename) . "\n";
    }
    finfo_close($finfo);
?>

上記の例は、チェックすべきものと同様のものを出力します。

text/html
image/gif
application/vnd.ms-excel

MIME タイプもだまされる可能性がありますが (ファイルの最初の数バイトを編集してマジック ナンバーを変更する)、ファイル名を編集するよりも困難です。そのため、そのファイルの種類が実際に何であるかを 100% 確実に知ることはできません。ユーザーがアップロードまたは電子メールで送信したファイルの処理には注意が必要です。

于 2012-05-04T21:08:07.793 に答える
13

個人的には、preg_match()関数を使用することを好みます。

if(preg_match("/\.(gif|png|jpg)$/", $filename))

またはin_array()

$exts = array('gif', 'png', 'jpg'); 
if(in_array(end(explode('.', $filename)), $exts)

Within_array()は、検証する拡張機能とパフォーマンスに関する質問が多数ある場合に役立ちます。ファイル イメージを検証する別の方法: を使用できます@imagecreatefrom*()。関数が失敗した場合、これはイメージが有効でないことを意味します。

例えば:

function testimage($path)
{
   if(!preg_match("/\.(png|jpg|gif)$/",$path,$ext)) return 0;
   $ret = null;
   switch($ext)
   {
       case 'png': $ret = @imagecreatefrompng($path); break;
       case 'jpeg': $ret = @imagecreatefromjpeg($path); break;
       // ...
       default: $ret = 0;
   }

   return $ret;
}

それから:

$valid = testimage('foo.png');

foo.pngこれが拡張子付きの PHP スクリプト ファイルであると仮定すると.png、上記の関数は失敗します。shell update やLFIなどの攻撃を回避できます。

于 2012-05-04T21:08:52.533 に答える
6

pathinfo はクールですが、コードを改善できます。

$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$allowed = array('jpg','png','gif');
if( ! in_array( $ext, $allowed ) ) {echo 'error';}

もちろん、ファイル名の拡張子を確認するだけでは、ファイルの種類が有効な画像であるとは限りません。getimagesizeアップロードされた画像ファイルを検証するような関数を使用することを検討してください。

于 2012-05-04T21:09:51.050 に答える
4

ファイルタイプは他の方法でも確認できます。アップロードされたファイルの種類を確認するには、これが最も簡単な方法だと思います。画像ファイルを扱っている場合は、次のコードを使用してください。ビデオ ファイルを扱っている場合は、if ブロックのイメージ チェックをビデオ チェックに置き換えます。楽しんでください。

     $img_up = $_FILES['video_file']['type'];
$img_up_type = expand("/", $img_up);
$img_up_type_firstpart = $img_up_type[0];

if($img_up_type_firstpart == "image") { // image は画像ファイル タイプです。ビデオ ファイル タイプを確認する必要がある場合は、ビデオを扱うことができます

/* 論理コードを実行します */ }

于 2016-03-09T09:53:41.033 に答える
3

これを適切に実現するには、MIME タイプを確認することをお勧めします。

function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "shell_exec")) {
    // http://stackoverflow.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}
//pass the file name as
echo(get_mime($_FILES['file_name']['tmp_name']));
于 2017-05-22T08:20:26.410 に答える
2

これにより計算時間が短縮されるかどうかはわかりませんが、別のオプション...

$acceptedFormats = array('gif', 'png', 'jpg');

if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) {
    echo 'error';
}
于 2012-05-04T21:10:35.930 に答える
-2

この機能を使用します

 function check_image_extension($image){

        $images_extentions = array("jpg","JPG","jpeg","JPEG","png","PNG");

        $image_parts = explode(".",$image);

        $image_end_part = end($image_parts);

        if(in_array($image_end_part,$images_extentions ) == true){

            return time() . "." . $image_end_part;


        }else{

            return false;
        }


    }
于 2016-12-02T17:33:39.233 に答える