web-dev-qa-db-fra.com

php check extension de fichier sous forme de téléchargement

Je vérifie l'extension du fichier pour le téléchargement ou non. i.e mes méthodes ont fonctionné mais maintenant je dois comprendre, mes méthodes (pathinfo) sont vraies? un autre moyen meilleur et plus rapide?! Merci

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

En utilisant if( $ext !== 'gif') pourrait ne pas être efficace si vous autorisez environ 20 extensions différentes

Essayer

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

La vérification de l’extension du fichier n’est pas considérée comme une pratique recommandée. La méthode recommandée pour réaliser cette tâche consiste à vérifier les fichiers type mime .

De PHP:

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

L'exemple ci-dessus produira quelque chose de similaire à ce que vous devriez vérifier.

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

Bien que les types mime puissent également être piégés (éditer les premiers octets d’un fichier et modifier les nombres magiques), mais c’est plus difficile que d’éditer un nom de fichier. Par conséquent, vous ne pouvez jamais être sûr à 100% de la nature réelle de ce type de fichier et il convient de prendre des précautions lors du traitement des fichiers téléchargés/envoyés par courrier électronique par vos utilisateurs.

47
Reza S

Personnellement, je préfère utiliser la fonction preg_match () :

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

ou in_array ()

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

Avec in_array() peut être utile si vous avez beaucoup d’extensions pour valider et poser des questions. Une autre façon de valider les images de fichier: vous pouvez utiliser @imagecreatefrom*(), si la fonction échoue, cela signifie que l'image n'est pas valide.

Par exemple:

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;
}

ensuite:

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

En supposant que foo.png Soit un fichier de script PHP portant l'extension .png, La fonction ci-dessus échoue. Il peut éviter des attaques telles que la mise à jour de Shell et LFI .

10
Jack

pathinfo est cool mais votre code peut être amélioré:

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

Bien entendu, le simple fait de vérifier l’extension du nom de fichier ne garantirait pas le type de fichier en tant qu’image valide. Vous pouvez envisager d'utiliser une fonction telle que getimagesize pour valider les fichiers image téléchargés.

5
Conrad Warhol

le type de fichier peut également être vérifié d'autres manières. Je crois que c’est le moyen le plus simple de vérifier le type de fichier téléchargé. Si vous avez affaire à un fichier image, recherchez le code suivant. si vous avez affaire à un fichier vidéo, remplacez la vérification d'image par une vérification vidéo dans le bloc if .. amusez-vous

 $ 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 est le type de fichier image, vous pouvez utiliser la vidéo si vous devez vérifier le type de fichier vidéo .
/ * fait votre code logique */ }
4
priyam

Pas sûr que cela aurait un temps de calcul plus rapide, mais une autre option ...

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

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

Pour y parvenir correctement, il serait préférable de vérifier le type 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
Akintunde-Rotimi

je pense que cela pourrait fonctionner pour vous

//<?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
Onwu Bishop Gideon

Comment valider l'extension de fichier (jpg/jpeg uniquement) sur un formulaire avant que le téléchargement ait lieu. Une variation d'une autre réponse publiée ici avec un filtre de données inclus peut être utile lors de l'évaluation d'autres valeurs de formulaire publiées. Remarque: l'erreur est laissée vide si vide, car il s'agissait d'une option pour mes utilisateurs et non d'une exigence.

<?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;
}
<?

Votre html ressemblera à quelque chose comme ça;

<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