


Comment gérer les téléchargements de fichiers en toute sécurité dans PHP?
Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contrôler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contrôle de liste blanche; 2. Renommez le fichier à une chaîne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.
Le téléchargement de fichiers est une fonctionnalité commune dans de nombreuses applications PHP, mais si elle est gérée accidentellement, elle peut facilement apporter des risques de sécurité. Le problème le plus direct est: les fichiers téléchargés par les utilisateurs peuvent contenir du code malveillant. Par conséquent, le cœur d'assurer la sécurité du téléchargement de fichiers réside dans la vérification, la restriction et l'isolement .

Ce qui suit est basé sur plusieurs scénarios réels et parler de la façon de gérer en toute sécurité les téléchargements de fichiers dans PHP.
1. Vérifiez la source de téléchargement et le type de fichier
Tout d'abord, assurez-vous que la demande de téléchargement est en effet de votre propre formulaire, pas une demande faite par d'autres. Vous pouvez empêcher les attaques CSRF en vérifiant $_SERVER['HTTP_REFERER']
(bien que pas entièrement fiable), ou en utilisant un jeton unique.

Deuxièmement, ne comptez pas seulement sur le client pour juger le type de fichier . Le type MIME est fourni lorsque le navigateur se télécharge, mais cela peut être truqué. Php fournit des fonctions mime_content_type()
ou finfo_file()
pour lire le type de fichier réel:
$ finfo = finfo_open (fileInfo_mime_type); $ mime = finfo_file ($ finfo, $ _files ['file'] ['tmp_name']);
Il est recommandé de contrôler les types autorisés de contrôle blanche, tels que:

- Catégorie d'image:
image/jpeg
,image/png
- Classe de documents:
application/pdf
, etc.
La méthode de liste noire est sujette à manquer de nouvelles méthodes d'attaque et n'est pas recommandée.
2. Nom du fichier de contrôle et chemin de stockage
N'utilisez pas directement les noms de fichiers téléchargés par les utilisateurs, car il peut y avoir des caractères spéciaux ou des structures cachées, telles que des fichiers .php
qui se dégagent sous forme d'images.
La méthode est très simple:
- Renommez le fichier à une chaîne aléatoire, telle que
md5(uniqid()) . '.jpg'
- Ne faites pas confiance à l'extension du fichier d'origine, déterminez le suffixe par le type réel de détection
De plus, ne placez pas le répertoire de téléchargement sous le chemin d'accès Web . Par exemple, enregistrez le fichier dans /var/www/uploads/
plutôt dans uploads/
dans le répertoire root du site Web, de sorte que même si le script exécutable est téléchargé, il ne peut pas être directement accessible et exécuté.
3. Définir les restrictions de sécurité pour le serveur et le PHP
PHP est livré avec certains éléments de configuration liés au téléchargement, réglé dans php.ini
:
-
upload_max_filesize
etpost_max_size
: Contrôlez la taille maximale de téléchargement -
file_uploads
: s'il faut permettre le téléchargement -
upload_tmp_dir
: répertoire temporaire, de préférence réglé sur un chemin non Web
Le niveau Apache / Nginx peut également être restreint, comme Nginx:
Emplacement / téléchargement / { nier tout; }
Cela empêche les utilisateurs d'accéder directement au contenu dans le répertoire téléchargé.
Vous pouvez également envisager d'ajouter .htaccess
(apache) au répertoire de téléchargement pour interdire l'exécution du script:
Options -execcgi-indexes AddHandler cgi-script .php .php3 .pl .py .jsp .asp
4. Traitement secondaire de fichiers multimédias tels que des images
Si votre application accepte les téléchargements d'images, une mesure de sécurité supplémentaire consiste à «traiter» ces images:
- Ouvrez l'image avec GD ou Imagick et enregistrez-la à nouveau
- Cela peut éliminer les données malveillantes intégrées dans l'image (comme les scripts transportés par les informations EXIF)
Exemple d'extrait de code:
$ image = ImageCreateFromJPEG ($ _ fichiers ['file'] ['tmp_name']); imagejpeg ($ image, 'new_image.jpg'); iMageDestroy ($ image);
Bien que toutes les attaques ne puissent pas être complètement éliminées, elles peuvent efficacement améliorer la sécurité.
Fondamentalement, c'est tout. Le point clé est toujours le même vieux dicton: ne faites jamais confiance à la saisie des utilisateurs . Bien que la fonction de téléchargement soit courante, elle deviendra une entrée de porte dérobée si vous ne faites pas attention. Ce n'est qu'en faisant un bon travail de vérification, en restreignant les autorisations et en isolant l'environnement que vous pouvez vraiment réduire les risques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



FataleRrorsInphPhaltexEcutionAndCannotBecaughtByTry-Catchblocks.2.UseRegister_Shutdown_Function () TODETECTFATALERRORSVIAERROR_GET_LAST () ANDRESPONDAPROPROPROPROPROPROPROPROPROPROPROPROPROPROPROPROPTOR

Utilisez la fonction Array_Unique () pour supprimer les valeurs en double dans le tableau, conserver les éléments d'apparence et convaincre les tableaux d'indexation et associatifs, par exemple: $ fruits = ['pomme', 'banana', 'Apple', 'Orange', 'Banana']; $ UNIQUE_FRUITS = Array_Unique ($ fruits); Le résultat est [«pomme», «banane», «orange»]; Cette fonction conserve le nom de clé d'origine, si vous avez besoin de réindexer, vous pouvez utiliser array_values (); Notez qu'il est basé sur la comparaison des chaînes et que les types mixtes peuvent affecter les résultats. Si vous devez vérifier strictement, il est recommandé de le traiter dans une boucle personnalisée.

UsepreparedstatementsWithpDoOrMysqlitoseParatesqllogicfromdata, empêchant le point de vue

Le constructeur __Contruct () est automatiquement exécuté lorsque l'objet est créé et utilisé pour l'initialisation, tel que l'attribution ou l'établissement de connexions; 2. Le destructeur __Drestruct () est appelé lorsque l'objet est détruit et est utilisé pour libérer des ressources, tels que la fermeture d'un fichier. Les deux gèrent conjointement le cycle de vie de l'objet PHP.

Le générateur enregistre efficacement la mémoire en sortissant des valeurs une par une plutôt que de renvoyer le tableau complet à la fois. Utilisez la fonction de rendement pour retourner l'objet générateur, générer des valeurs selon les besoins et éviter une grande quantité de mémoire consommatrice de données.

Utilisez SPL_autoload_register () pour charger automatiquement les fichiers de classe PHP pour éviter l'importation manuelle; Il est recommandé d'utiliser Composer pour implémenter la norme PSR-4, les répertoires MAP via l'espace de noms, tels que App \ Models \ User correspondant à SRC / Models / User.php, exécutez ComposerDump-Autoload pour générer des fichiers de chargement automatiques, puis introduire Vendor / Autoload.php.

Useis_null () ou === TOCHECK FORNULLINPHP.IS_NULL ($ était) returnstrueif $ Varisnull.al Alternatives, $ était === ZerensuresOnlyNullvaluSe esreturnTrue, False EvaluatotherFaltothesyvalues Zone de l'assitmayincorrectyeveatotherfalsyvalues.

Utilisez preg_match () pour une seule correspondance, preg_match_all () pour une correspondance globale, et combinez des modificateurs réguliers et des caractères spéciaux échappés pour réaliser efficacement la correspondance de motifs en php.
