Position actuelle: Accueil> Derniers articles> Quels problèmes se produiront si image_type_to_extension () ne vérifie pas le format de fichier lorsqu'il est utilisé? Quels sont les risques?

Quels problèmes se produiront si image_type_to_extension () ne vérifie pas le format de fichier lorsqu'il est utilisé? Quels sont les risques?

M66 2025-06-23

Risque de ne pas vérifier les formats de fichiers

1. Types de fichiers forgés Vérification de téléchargement de contournement

Un attaquant peut télécharger un script malveillant (comme le code PHP) en se faisant passer pour une image. Par exemple, nommez un script contenant une porte dérobée PHP .jpg ou .png et téléchargez-la. Si vous n'utilisez pas eXif_imageType () pour détecter le type de fichier réel, Image_Type_To_Extension () peut renvoyer par erreur l'extension juridique, tromper la logique suivante et même l'enregistrer dans le répertoire exécutable:

 $filename = $_FILES['image']['tmp_name'];
$ext = image_type_to_extension(@exif_imagetype($filename));
// Mauvaise utilisation:Aucune détectionexif_imagetypeEst la valeur de retour lafalse
$newName = uniqid() . $ext;
move_uploaded_file($filename, "/var/www/html/uploads/" . $newName);

Si le fichier téléchargé n'est pas une vraie image, comme un faux script PHP, mais l'extension est .jpg , un attaquant peut exécuter du code malveillant en visitant http://m66.net/uploads/xxxx.jpg .

2. Exif_imageType () échoue et renvoie faux, mais passe toujours dans image_type_to_extension ()

Lorsque exif_imageType () ne reconnaît pas le type de fichier, il renvoie false . Si le résultat est toujours transmis dans image_type_to_extension () pour le moment, .int (0) sera retourné, entraînant une confusion dans le nom de fichier généré et même des exceptions logiques. Par exemple:

 $type = exif_imagetype($filename);
$ext = image_type_to_extension($type);
// si$typepourfalse,$extpour"."

Cela peut amener le programme à utiliser la mauvaise extension de fichier, affecter les opérations ultérieures et même provoquer une fuite de ressources.

3. FileInfo ou extension exif n'est pas activé

Dans certains environnements de serveur, exif_imageType () échoue si PHP n'activait pas les extensions FileInfo ou EXIF . Si vous comptez toujours sur ses résultats et que vous passez Image_Type_To_Extension () , le programme est enclin à écraser ou à gérer les erreurs logiques, affectant l'expérience utilisateur.

4. La politique de sécurité qui dépend des extensions n'est pas valide

Certaines politiques de sécurité du déploiement de services sont limitées en fonction des extensions, telles que seuls les fichiers .jpg et .png sont autorisés à être accessibles. Si un attaquant a forgé le nom du fichier et contourné la vérification du backend, le serveur peut incorrectement accorder un accès.

Par exemple, un fichier nommé .php.jpg est téléchargé, mais le format réel est PHP. Nginx sera exécuté sous certaines configurations en tant que fichier .php , entraînant de graves conséquences:

 <?php echo shell_exec($_GET['cmd']); ?>

Puis accès par:

 http://m66.net/uploads/backdoor.php.jpg?cmd=ls

Vous pouvez contrôler à distance le serveur.


La bonne façon de l'utiliser

Afin d'éviter les risques ci-dessus, les mesures suivantes doivent être prises:

  1. Utilisez exif_imageType () et déterminez si la valeur de retour est fausse

  2. Utilisez finfo_file () pour vérifier davantage les types de mime

  3. Répertoire de téléchargement restreint non exécutable

  4. Ne faites pas confiance aux extensions soumises par l'utilisateur

  5. Vérifiez la valeur de retour de l'image_type_to_extension () à l'aide de la liste blanche

Exemple de code:

 $filename = $_FILES['image']['tmp_name'];
$imageType = @exif_imagetype($filename);

if ($imageType === false) {
    die('Formats d&#39;image non pris en charge');
}

$ext = image_type_to_extension($imageType, false);
$allowed = ['jpg', 'jpeg', 'png', 'gif'];

if (!in_array($ext, $allowed)) {
    die('Types d&#39;images non autorisés');
}

$newName = uniqid() . '.' . $ext;
move_uploaded_file($filename, '/var/www/uploads/' . $newName);