Dans le développement Web, le téléchargement de fichiers et le téléchargement sont des modules fonctionnels courants. Cependant, si l'entrée et la sortie de l'utilisateur ne sont pas strictement contrôlées, il est facile de devenir le point d'entrée des attaques. Cet article se concentrera sur le langage PHP et présentera comment utiliser les fonctions d'entrée et de sortie des utilisateurs pour contrôler efficacement la sécurité pendant le téléchargement et le téléchargement de fichiers.
Avant de traiter une demande de téléchargement, la première étape consiste à vérifier le type de fichier. Cela peut généralement être fait avec une vérification à deux facteurs des extensions de fichiers et des types de mime:
$allowedExtensions = ['jpg', 'png', 'gif'];
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
$uploadedFileExtension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$uploadedFileType = $_FILES['file']['type'];
if (!in_array($uploadedFileExtension, $allowedExtensions) ||
!in_array($uploadedFileType, $allowedMimeTypes)) {
// Type de fichier illégal,Effectuer une logique de traitement
}
Afin d'empêcher l'exécution de scripts malveillants et les attaques d'assouplissement du chemin, il est recommandé de renommer automatiquement les fichiers téléchargés par les utilisateurs:
$uploadedFileName = $_FILES['file']['name'];
$uploadedFileExtension = strtolower(pathinfo($uploadedFileName, PATHINFO_EXTENSION));
$newFileName = uniqid() . '.' . $uploadedFileExtension;
$newFilePath = '/path/to/upload/directory/' . $newFileName;
if (move_uploaded_file($_FILES['file']['tmp_name'], $newFilePath)) {
// Télécharger le fichier avec succès
}
En plus de l'extension et de la vérification du mime, il est recommandé d'analyser davantage le contenu réel du fichier. Par exemple, vous pouvez utiliser getImageSize () ou une bibliothèque tierce pour déterminer si le fichier téléchargé est une vraie image:
$fileData = file_get_contents($_FILES['file']['tmp_name']);
if (!is_image($fileData)) {
// Les fichiers ne sont pas de vraies images,Effectuer une logique de traitement
}
function is_image($fileData){
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (function_exists('mime_content_type')) {
$fileMimeType = mime_content_type($fileData);
return in_array($fileMimeType, $allowedMimeTypes);
} else {
$finfo = new finfo(FILEINFO_MIME_TYPE);
$fileMimeType = $finfo->buffer($fileData);
return in_array($fileMimeType, $allowedMimeTypes);
}
}
Avant d'exécuter la logique de téléchargement du fichier, il est nécessaire de confirmer que le fichier demandé par l'utilisateur existe et a des droits d'accès:
$requestedFilePath = $_GET['file'];
if (!is_file($requestedFilePath) || !is_readable($requestedFilePath)) {
// Le fichier n'existe pas ou n'est pas lisible
}
Afin d'empêcher le navigateur d'exécuter accidentellement du contenu de téléchargement, les informations d'en-tête HTTP requises pour le téléchargement des fichiers doivent être définies:
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . basename($requestedFilePath));
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($requestedFilePath));
readfile($requestedFilePath);
Lors de la mise en œuvre du téléchargement et du téléchargement de fichiers dans PHP, se fier uniquement aux fonctions de base est loin d'être suffisant. Un système de gestion de fichiers plus fiable et sécurisé doit être construit avec plusieurs moyens tels que la vérification du type de fichier, le renomment de traitement, la numérisation sécurisée et le contrôle de l'autorisation de téléchargement. De plus, il est également recommandé de limiter la taille du fichier de téléchargement, de contrôler les autorisations de répertoire de téléchargement et de prévenir les abus de téléchargement et d'autres stratégies détaillées.