1. Téléchargement de fichiers
Pour que l'utilisateur du client puisse télécharger des fichiers, nous devons fournir un formulaire dans l'interface utilisateur pour soumettre des demandes pour télécharger des fichiers. Étant donné que le fichier téléchargé est une donnée spéciale, contrairement à d'autres données de poste, nous devons définir un encodage spécial pour le formulaire:
Copiez le code comme suit: <formulaire form = "upload.php" method = "post" EncType = "multipart / form-data"> </ form>
Vous ne connaissez peut-être pas les attributs ENCType ci-dessus, car cela est souvent ignoré. Cependant, si la demande de post HTTP contient à la fois des données régulières et des données de type fichier, cet attribut doit être ajouté, ce qui peut améliorer la compatibilité de divers navigateurs.
Ensuite, nous devons ajouter un champ au formulaire pour télécharger le fichier:
Copiez le code comme suit: <input type = "file" name = "pièce jointe">
Les champs de fichiers ci-dessus peuvent se comporter différemment dans divers navigateurs. Pour la plupart des navigateurs, les champs ci-dessus sont rendus dans une zone de texte avec un bouton de navigation. De cette façon, l'utilisateur peut saisir le chemin du fichier dans la zone de texte par lui-même ou sélectionner le fichier à télécharger dans le disque dur local via le bouton de navigation. Cependant, dans Apple's Safari, il semble que seule la navigation puisse être utilisée. Bien sûr, vous pouvez également personnaliser le style de cette boîte de téléchargement pour le rendre plus élégant que le style par défaut.
Ci-dessous, afin de mieux expliquer comment gérer les téléchargements de fichiers, donnez un exemple complet. Par exemple, le formulaire suivant permet aux utilisateurs de télécharger des pièces jointes sur mon serveur local:
Copiez le code comme suit: <p> Veuillez télécharger votre pièce jointe: </p>
<form action = "upload.php" méthode = "post" enctype = "multipart / form-data">
<input type = "file" name = "pièce jointe">
<input type = "soumi" value = "télécharger la pièce jointe">
</ form>
Astuce: vous pouvez définir la valeur maximale qui permet de télécharger des fichiers via upload_max_filesize dans php.ini. De plus, il existe également un post_max_size qui peut être utilisé pour définir les données de formulaire maximales qui peuvent être téléchargées. en définissant ce champ. Cependant, notez que la valeur de la seconde doit être supérieure à la première, car la première appartient à une partie des données de forme de la seconde.
Figure 1. Formulaire de téléchargement illustré dans Firefox
Lorsque ce formulaire est soumis, la demande HTTP sera envoyée pour télécharger.php. Afin de montrer quelles informations spécifiques peuvent être utilisées dans upload.php, je l'ai imprimée dans upload.php:
La copie de code est la suivante:
En-tête («Type de contenu: texte / plaine»);
print_r ($ _ fichiers);
Faisons une expérience.
Copiez le code comme suit: Array
(
[pièce jointe] => tableau
(
[nom] => boy.jpg
[type] => image / jpeg
[tmp_name] => d: /xampp/tmp/php1168.tmp
[erreur] => 0
[Taille] => 11490
)
)
Ce qui précède est toutes les informations sur le fichier actuellement téléchargé dans le tableau global une fois le fichier téléchargé. Cependant, pouvons-nous nous assurer que ces informations sont sûres, que se passe-t-elle si le nom ou d'autres informations ont été falsifiés? Nous devons toujours être vigilants sur les informations des clients!
Chaque partie de la demande HTTP spécifique
Afin de mieux comprendre le téléchargement de fichiers, nous devons vérifier les informations spécifiques contenues dans la demande HTTP envoyée par le client. La pièce jointe que j'ai téléchargée auparavant était le logo de ce blog, car c'est une image, il ne nous convient pas de faire les expériences ci-dessus. J'ai donc téléchargé à nouveau un fichier texte Test.Text, qui contient le contenu suivant:
La copie de code est la suivante:
360W
360 jours
La vie d'un Web Boy
D'accord. Maintenant, je télécharge ce fichier texte et je le publie dans upload.php:
La copie de code est la suivante:
Tableau
(
[pièce jointe] => tableau
(
[nom] => test.txt
[Type] => Texte / Plain
[tmp_name] => d: /xampp/tmp/php51c0.tmp
[erreur] => 0
[Taille] => 40
)
)
Jetons un coup d'œil à la demande HTTP Post envoyée par le navigateur concerné (j'ai omis des en-têtes facultatifs):
La copie de code est la suivante:
Post /upload.php http / 1.1
Hôte: www.360weboy.me
Référer: http://www.360weboy.me/
multiparte / format de forme; -------------------------------------------------- -------------------------
Longueur du contenu: 234
--------------------------------------- 24464570528145
Disposition de contenu: formulaire de formulaire;
Type de contenu: texte / simple
360Weboy
360 jours
La vie d'un Web Boy
------------------------------------ 24464570528145-
Il y a plusieurs champs dans le format de demande ci-dessus, le nom de fichier et le type de contenu. test.txt, et le format de fichier téléchargé texte / plaine (représente le fichier texte). Ensuite, nous voyons que la ligne suivante est le contenu spécifique du fichier téléchargé.
2. Renforcement de la sécurité
Afin d'améliorer la sécurité en téléchargement de fichiers, nous devons vérifier le nom et la taille TMP_NAME dans le tableau global $ _files. Afin de s'assurer que le fichier pointé par TMP_NAME est en effet le fichier téléchargé par l'utilisateur 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 le jugement suivant :
La copie de code est la suivante:
$ filename = $ _files ['pièce jointe'] ['tmp_name'];
if (is_uploaded_file ($ filename)) {
/ * est un fichier téléchargé.
}
Dans certains cas, après que l'utilisateur a téléchargé le fichier, le contenu du fichier téléchargé avec succès peut être affiché à l'utilisateur pour la visualisation, de sorte que la vérification du code ci-dessus est particulièrement importante.
Une autre chose à vérifier est le type MIME du fichier de téléchargement, qui est le champ de type du tableau de sortie dans le upload.php ci-dessus. Ce que j'ai téléchargé dans le premier exemple est une image, donc la valeur de $ _files ['attachement'] ['type'] est 'image / jpeg'. Si vous prévoyez d'accepter uniquement des images de type mime telles que l'image / png, l'image / jpeg, l'image / gif, l'image / x-png et l'image / p-jpeg côté serveur, vous pouvez utiliser du code similaire à ce qui suit pour vérifier (Jetez un coup d'œil) des exemples, des codes spécifiques, tels que des erreurs, doivent suivre les mécanismes de votre système):
La copie de code est la suivante:
$ allow_mimes = array (
'image / png',
'image / x-png',
'image / gif',
'image / jpeg',
'Image / Pjpeg'
));
$ image = $ _files ['pièce jointe'];
if (! in_array ($ image ['type'], $ allow_mimes)) {
Die ('Désolé, le format de fichier que vous avez téléchargé est inexact; nous acceptons uniquement les fichiers image.');
}
// continue de traiter les fichiers d'image téléchargés
Comme vous pouvez le voir, nous avons veillé à ce que le type MIME du fichier réponde aux exigences côté serveur. Cependant, il ne suffit pas d'empêcher les utilisateurs malveillants de télécharger d'autres fichiers nocifs, car les utilisateurs malveillants peuvent faire semblant d'être déguisés par ce type MIME. Par exemple, l'utilisateur a créé une image JPG, a écrit un code PHP malveillant dans les métadonnées de l'image et l'a enregistrée en tant que fichier avec le suffixe nommé PHP. Lorsque ce fichier malveillant sera téléchargé, il sera vérifié avec succès par le côté serveur pour le type MIME, qui est considéré comme une image, et le code PHP dangereux à l'intérieur sera exécuté. Les métadonnées de l'image spécifique sont similaires à ce qui suit:
La copie de code est la suivante:
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: PASTTHRU ($ _ POST ['CMD']); __halt_compiler ();
Nous pouvons voir que le code PHP est ajouté au champ de commentaires des métadonnées d'image. Il est donc évident que pour empêcher des situations dangereuses similaires, une vérification nécessaire de l'extension du fichier téléchargé doit également être effectuée. Le code suivant améliore le code précédent pour vérifier le type MIME:
La copie de code est la suivante:
$ allow_mimes = array (
'image / png' => '.png',
'image / x-png' => '.png',
'image / gif' => '.gif',
'image / jpeg' => '.jpg',
'image / pjpeg' => '.jpg'
));
$ image = $ _files ['pièce jointe'];
if (! array_key_exists ($ image ['type'], $ allow_mimes)) {
Die ('Désolé, le format de fichier que vous avez téléchargé est inexact; nous acceptons uniquement les fichiers image.');
}
// Obtenez le nom du fichier avec le nom du suffixe omis:
$ filename = substr ($ image ['name'], 0, strPos ($ image ['name'], '.'));
// Ajouter un nom de suffixe
$ filename. = $ allow_mimes [$ image ['type']];
// continue de traiter les fichiers téléchargés
Grâce au code ci-dessus, nous nous assurons que même si l'image téléchargée Metafile contient le code PHP, le fichier image sera renommé comme un fichier avec le nom du suffixe et le format d'image, de sorte que le code PHP ne sera pas exécuté. Le code ci-dessus n'aura aucun impact négatif sur les images normales téléchargées.
Après avoir effectué les plusieurs étapes ci-dessus pour améliorer les vérifications de 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 move_uploaded_file de PHP pour l'implémenter:
La copie de code est la suivante:
$ tmp_filename = $ _files ['pièce jointe'] ['tmp_name'];
$ filename = '/path/to/attachment.txt';
if (move_uploaded_file (tmp_filename, $ filename)) {
/ * $ temp_filename Le fichier de téléchargement enregistré dans le répertoire temporaire, puis enregistrez-le avec succès dans le fichier joint.txt dans le répertoire correspondant.
}
Vous devrez peut-être également limiter la taille du fichier téléchargé, vous pouvez donc utiliser la fonction de taille de fichiers pour obtenir la taille du fichier téléchargé, faire des jugements et faire un traitement ultérieur.
D'accord, écrivons ceci pour l'instant sur le téléchargement de fichiers. J'espère que cet article d'introduction vous sera utile.