Figure 1. Formulaire de téléchargement affiché dans Firefox
Lorsque ce formulaire est soumis, la requête http sera envoyée à upload.php. Pour montrer exactement quelles informations sont disponibles dans upload.php, je les imprime dans upload.php :
Faisons une expérience ci-dessous. le formulaire ci-dessus pour télécharger un logo de ce blog sur mon serveur local www.360weboy.me/upload.php et voir quelles informations seront affichées dans upload.php :
Ce qui précède est toutes les informations sur le fichier actuellement téléchargé dans le tableau global après le téléchargement du fichier. Cependant, pouvons-nous garantir que ces informations sont sécurisées ? Que se passe-t-il si le nom ou d’autres informations ont été falsifiés ? Il faut toujours être vigilant sur les informations des clients !
Parties de la requête http spécifique
Afin de mieux comprendre le téléchargement de fichiers, nous devons vérifier quelles informations spécifiques sont incluses dans la requête http envoyée par le client. La pièce jointe que j'ai téléchargée plus tôt est le logo de ce blog. Comme il s'agit d'une image, elle ne nous convient pas pour faire l'expérience ci-dessus. J'ai donc relancé un fichier texte test.text, qui contient spécifiquement le contenu suivant :
Copier le code
Le code est le suivant suit : 360w 360 jours La vie d'un Web Boy
D'accord. Maintenant, lorsque je télécharge ce fichier texte, il sera affiché dans upload.php :
----- ------------------------------------24464570528145 Content-Disposition : form-data ; "attachment" ; " Type de contenu : texte/plain
360weboy
360 jours
Vie d'un Web Boy ----------- -- ----------------24464570528145--
Il y a plusieurs champs dans le format de demande ci-dessus auxquels nous devons prêter attention, à savoir le nom, filename et Content-Type Ils représentent respectivement le nom du champ de la boîte de téléchargement du fichier dans le formulaire - pièce jointe, le nom du fichier téléchargé par l'utilisateur depuis le disque dur local - test.txt et le format du fichier téléchargé - text/. plain (représentant un fichier texte). Ensuite, nous voyons une ligne vide ci-dessous, qui correspond au contenu spécifique du fichier téléchargé.
2. Amélioration de la sécurité Afin d'améliorer la sécurité du téléchargement de fichiers, nous devons vérifier le nom et la taille du tmp dans le tableau global $_FILES. Afin de vous assurer que le fichier pointé par tmp_name est bien le fichier que l'utilisateur vient de télécharger sur le client, plutôt que de pointer vers quelque chose comme /etc/passwd, vous pouvez utiliser la fonction is_uploaded_file() en PHP pour porter un jugement :
if (is_uploaded_file($filename)) { /* Est un fichier téléchargé */ }
Dans. Dans certains cas, une fois que l'utilisateur a téléchargé le fichier, le contenu du fichier téléchargé avec succès sera affiché à l'utilisateur, il est donc particulièrement important de vérifier le code ci-dessus.
Une autre chose qui doit être vérifiée est le type MIME du fichier téléchargé, qui est le champ type du tableau de sortie dans upload.php mentionné ci-dessus. Ce que j'ai téléchargé dans le premier exemple est une image, donc la valeur de $_FILES['attachment']['type'] est 'image/jpeg'. Si vous prévoyez d'accepter uniquement les images de type MIME telles que image/png, image/jpeg, image/gif, image/x-png et image/p-jpeg côté serveur, vous pouvez utiliser un code similaire à celui-ci pour vérifier (donnez simplement un exemple. Exemples, des codes spécifiques, tels que le rapport d'erreurs, etc., doivent suivre le mécanisme de votre système) :
qui, qui, qui est, image/jpeg', Allow_mimes)) { DIE ("Désolé, le format de fichier que vous avez téléchargé est inexact ; nous n’acceptons que les fichiers image.');
Comme vous pouvez le constater, nous nous sommes assurés que le type MIME du fichier répond aux exigences côté serveur. Cependant, il ne suffit pas d'empêcher les utilisateurs malveillants de télécharger d'autres fichiers nuisibles, car cet utilisateur malveillant de type MIME peut être déguisé. Par exemple, l'utilisateur a créé une image jpg, a écrit du code php malveillant dans les métadonnées de l'image, puis l'a enregistré sous forme de fichier avec le suffixe php. Lorsque ce fichier malveillant est téléchargé, il passera avec succès la vérification du type MIME côté serveur et sera considéré comme une image, et le code PHP dangereux qu'il contient sera exécuté. Les métadonnées spécifiques de l'image sont similaires aux suivantes :
Nom du fichier : image.jpg Taille du fichier : 182007 octets Date du fichier : 2012:11:27 7:45:10 Résolution : 1197 x 478 Commentaire : passthru( $_POST['cmd ']); __halt_compiler();
Nous pouvons voir que du code php a été ajouté au champ Commentaire des métadonnées de l'image. Par conséquent, il est évident que pour éviter que des situations dangereuses similaires ne se reproduisent, une vérification nécessaire doit être effectuée sur l’extension du fichier téléchargé. Le code suivant améliore le code précédent pour vérifier le type Mime :
if(!array_key_exists( $image['type'], $allow_mimes )) { die('Désolé, vous l'avez téléchargé, le format de fichier n'est pas exact ; nous n'acceptons que les fichiers image.'); , 0, strrpos($image ['nom'], '.'));
🎜> // Poursuivre le traitement du fichier téléchargé
Grâce au code ci-dessus, nous nous assurons que même si le Le méta-fichier de l'image téléchargée contient du code php, le fichier image sera renommé avec le suffixe Fichier nommé format d'image, donc le code php qu'il contient ne sera pas exécuté. Le code ci-dessus n'aura aucun impact négatif sur les images téléchargées normales.
Après avoir effectué les étapes ci-dessus pour améliorer la sécurité, si vous souhaitez simplement enregistrer le fichier téléchargé dans un répertoire spécifié, vous pouvez utiliser la fonction par défaut de PHP move_uploaded_file pour y parvenir :
/* $temp_filename enregistré dans le répertoire temporaire Téléchargez le fichier, puis avec succès enregistrez-le dans le fichier attachment.txt dans le répertoire correspondant */
}
Vous pouvez également limiter la taille du fichier téléchargé, vous pouvez alors la fonction de taille de fichier est utilisée pour obtenez la taille du fichier téléchargé et un traitement ultérieur est effectué après jugement. Ceci n'est pas détaillé ici, vous pouvez donc le découvrir vous-même.
D'accord, arrêtons d'écrire sur le téléchargement de fichiers ici pour le moment. J'espère que cet article d'introduction vous sera utile.
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn