web-dev-qa-db-ja.com

アップロードフォームのphp checkファイル拡張子

アップロードのファイル拡張子をチェックするか、アップロードしません。私のIEメソッドは機能しましたが、今私は理解する必要があります、私のメソッド(pathinfo)は本当ですか?別のより良い、より速い方法?!ありがとう

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

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';
}
125
Baba

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

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%確信することはできません。ユーザーがアップロード/メール送信したファイルの処理には注意が必要です。

47
Reza S

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

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

または in_array()

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

in_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.png拡張子を持つPHPスクリプトファイルであると仮定すると、上記の関数は失敗します。シェル更新や LFI などの攻撃を回避できます。

10
Jack

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

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

もちろん、単にファイル名の拡張子をチェックするだけでは、ファイルタイプが有効なイメージであるとは限りません。 getimagesizeなどの関数を使用して、アップロードされた画像ファイルを検証することを検討できます。

5
Conrad Warhol

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

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

if($ img_up_type_firstpart == "image"){// imageは画像ファイルの種類です。動画ファイルの種類を確認する必要がある場合は、動画を処理できます
/ *論理コードを実行*/ }
4
priyam

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

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

if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) {
    echo 'error';
}
2
liz

これを適切に達成するには、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']));
1

私はこれがあなたのために働くかもしれないと思う

//<?php
    //checks file extension for images only
    $allowed =  array('gif','png' ,'jpg');
    $file = $_FILES['file']['name'];
    $ext = pathinfo($file, PATHINFO_EXTENSION);
        if(!in_array($ext,$allowed) ) 
            { 
//?>
<script>
       alert('file extension not allowed');
       window.location.href='some_link.php?file_type_not_allowed_error';
</script>

//<?php
exit(0);
    }
//?>
1

アップロードが行われる前にフォーム上のファイル拡張子(jpg/jpegのみ)を検証する方法。他の投稿されたフォームの値を評価する際に役立つ可能性のあるデータフィルターを含む、ここに投稿された別の回答のバリエーション。注:これはユーザーのオプションであり、要件ではないため、空の場合、エラーは空白のままになります。

<?php
if(isset($_POST['save'])) {

//Validate image
if (empty($_POST["image"])) {
$imageError = "";
} else {
$image = test_input($_POST["image"]);
$allowed =  array('jpeg','jpg');
$ext = pathinfo($image, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
$imageError = "jpeg only";
}
}

}

// Validate data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
<?

HTMLは次のようになります。

<html>
<head>
</head>

<body>
<!-- Validate -->
<?php include_once ('validate.php'); ?>

<!-- Form -->
<form method="post" action="">

<!-- Image -->
<p>Image <?php echo $imageError; ?></p>
<input type="file" name="image" value="<?php echo $image; ?>" />

<p><input type="submit" name="save" value="SAVE" /></p>
</form>

</body>
</html>
0
user5340092