Maison >interface Web >js tutoriel >Tutoriel d'introduction au téléchargement de fichiers PHP (explication avec exemples)_Connaissances de base

Tutoriel d'introduction au téléchargement de fichiers PHP (explication avec exemples)_Connaissances de base

WBOY
WBOYoriginal
2016-05-16 16:52:531881parcourir

一、文件上传

为了让客户端的用户能够上传文件,我们必须在用户界面中提供一个表单用于提交上传文件的请求。由于上传的文件是一种特殊数据,不同于其它的post数据,所以我们必须给表单设置一个特殊的编码:

复制代码 代码如下:


以上的enctype属性,你可能不太熟悉,因为这常常会被忽略掉。但是,如果http post请求中既有常规数据,又包含文件类数据的话,这个属性就应该显示加上,这样可以提高针对各种浏览器的兼容性。

接下来,我们得向表单中添加一个用于上传文件的字段:

复制代码 代码如下:


上述文件字段在各种浏览器中可能表现会有所不同。对于大多数的浏览器,上述字段都会被渲染成一个文本框加上一个浏览按钮。这样,用户既可以自行输入文件的路径到文本框中,也可以通过浏览按钮从本地硬盘上选择所要上传的文件。但是,在苹果的Safari中,貌似只能使用浏览这种方式。当然,你也可以自定义这个上传框的样式,使它看起来比默认的样式优雅些。

下面,为了更好的阐述怎么样处理文件上传,举一个完整的例子。比如,以下一个表单允许用户向我的本地服务器上上传附件:

复制代码 代码如下:

请上传你的附件:






提示:可以通过php.ini中的upload_max_filesize来设置允许上传文件的最大值。另外,还有一个post_max_size也可以用来设置允许上传的最大表单数据,具体意思就是表单中各种数据之和,所以你也可以通过设置这个字段来控制上传文件的最大值。但是,注意后者的值必须大于前者,因为前者属于后者的一部分表单数据。

Tutoriel d'introduction au téléchargement de fichiers PHP (explication avec exemples)_Connaissances de base
 

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 :

Copier le code Code comme suit :

header('Content-Type: text/plain');
print_r($_FILES);


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 :
Copiez le code Le code est le suivant :
Array
                                                                                               [nom] => garçon .jpg
[type] => > [tmp_name] => D:xampptmpphp1168.tmp
[erreur] =&g t; 0
                                                                                                                > )

)



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 :



Copiez le code
Le code est le suivant : Tableau (
[pièce jointe] => Tableau
(
[nom] => test.tx t
       [type] => texte/plain
                                                                                                                                                                                               — 🎜>         )

                                                                                                      
omis certains en-têtes facultatifs) :




Copier le code


Le code est le suivant :


POST /upload.php HTTP/1.1
Hébergeur : www.360weboy.me
Référent : http://www.360weboy.me/
multipart/form-data ; limite=--------------------------24464570528145
Contenu-Longueur : 234

----- ------------------------------------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 :

Copier le code Le code est le suivant :


$filename = $_FILES[' attachment']['tmp_name'];

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) :

Copier le code Le code est le suivant :
                                                                                                                                                                                                      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 :
Copiez le code Le code est le suivant :


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 :
Copiez le code Le code est le suivant :


            $allow_mimes = array(
            'image/png' => image/gif' => '.gif',
'image/jpeg' => '.jpg ',
'image/pjpeg' => '.jpg'
);

$image = $_FILES['attachment'];

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 :



Copier le code


Le code est le suivant :

/* $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