Position actuelle: Accueil> Derniers articles> Meilleures pratiques lors de l'utilisation de PHP sérialiser en combinaison avec le téléchargement de fichiers

Meilleures pratiques lors de l'utilisation de PHP sérialiser en combinaison avec le téléchargement de fichiers

gitbox 2025-05-19

Dans le développement de PHP, la fonction sérialize () est souvent utilisée pour convertir les structures de données (telles que les tableaux ou objets) en chaînes pour un stockage ou une transmission facile. Cependant, lorsqu'il est utilisé conjointement avec les téléchargements de fichiers, des soins inadéquats peuvent entraîner des vulnérabilités de sécurité, en particulier lors de la désérialisation des données. Cet article discutera de la façon d'utiliser la fonction Serialize () en toute sécurité dans le scénario de téléchargement de fichiers et de suivre les meilleures pratiques.

1. Comprendre comment serialiser () et unserialiser ()

La fonction Serialize () de PHP convertit les valeurs PHP (telles que les tableaux, les objets, etc.) en formats de chaîne qui peuvent être stockés ou transférés. Par exemple:

 $data = ['username' => 'admin', 'password' => '12345'];
$serialized_data = serialize($data);
echo $serialized_data;

La sortie peut être:

 a:2:{s:8:"username";s:5:"admin";s:8:"password";s:5:"12345";}

Relativement, Unserialize () est utilisé pour convertir la sortie de la chaîne de Serialize () en valeurs PHP. Au cours du processus de téléchargement de fichiers, nous stockons généralement les données de fichier dans un fichier d'un certain format, comme le stockage des informations téléchargées par fichier via serialize () .

2. Processus de base du téléchargement de fichiers

Supposons que nous ayons une fonction de téléchargement de fichiers, où les utilisateurs peuvent télécharger des fichiers et stocker des informations pertinentes via Serialize () . Les codes de téléchargement de fichiers simples peuvent être les suivants:

 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    $file_data = [
        'filename' => $file['name'],
        'filetype' => $file['type'],
        'filesize' => $file['size'],
        'filetmp' => $file['tmp_name']
    ];

    // utiliser serialize() Stocker des informations sur les fichiers
    $serialized_data = serialize($file_data);
    file_put_contents('uploads/file_info.txt', $serialized_data);
}

3. Risques pendant la désérialisation

La désérialisation (c'est-à-dire Unserialize () ) peut présenter certains risques, en particulier lorsqu'un attaquant est capable de manipuler des données désérialisées, qui peuvent exécuter un code malveillant ou des dommages à l'intégrité des données. Par exemple, un attaquant peut télécharger des données sérialisées soigneusement construites contenant des objets ou du code PHP malveillants.

4. Mesures de sécurité pour prévenir les attaques de désérialisation

Pour assurer la sécurité de la désérialisation, voici quelques meilleures pratiques:

4.1 Évitez de stocker des informations sensibles lors de l'utilisation de sérialisation ()

Ne sérialisez pas les informations sensibles (telles que les mots de passe, les clés d'API, etc.) et les stockez via serialize () . Ces informations doivent toujours être stockées sous forme cryptée.

4.2 Vérifiez le type et la taille du fichier

Lors du téléchargement de fichiers, assurez-vous de vérifier le type de fichier et la taille du fichier pour éviter de télécharger des fichiers malveillants. Vous pouvez utiliser $ _files ['fichier'] ['type'] et $ _files ['fichier'] ['Size'] pour déterminer le type et la taille du fichier:

 if ($file['size'] > 5000000) {
    echo "Fichier trop grand";
    exit;
}

$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($file['type'], $allowed_types)) {
    echo "Types de fichiers non pris en charge";
    exit;
}

4.3 restreindre les classes autorisées lors de l'utilisation d'un non-service ()

PHP vous permet de créer des objets lorsqu'ils sont désérialisés. Si l'utilisation de la classe n'est pas limitée, l'attaquant peut passer dans un objet malveillant, ce qui déclenchera une exécution dangereuse du code. Vous pouvez empêcher la désérialisation des classes malveillantes en définissant le paramètre ALLOD_CLASSES :

 $data = file_get_contents('uploads/file_info.txt');
$file_data = unserialize($data, ["allowed_classes" => false]);  // Désactiver toute création d'objets

Cette décision peut effectivement empêcher les attaquants d'exécuter du code malveillant en utilisant des vulnérabilités de désérialisation.

4.4 Utilisation de la vérification du hachage

Pour assurer l'intégrité des données téléchargées, vous pouvez utiliser des valeurs de hachage (telles que MD5, SHA256) pour vérifier les données de fichier téléchargées. Lorsqu'un fichier est téléchargé, un hachage est généré et comparé au hachage du fichier réel, évitant ainsi la falsification.

 $uploaded_hash = hash_file('sha256', $file['tmp_name']);
$stored_hash = file_get_contents('uploads/file_hash.txt');
if ($uploaded_hash !== $stored_hash) {
    echo "Le contenu du fichier a été falsifié";
    exit;
}

4.5 Empêcher les vulnérabilités de téléchargement de fichiers

Le téléchargement de fichiers lui-même peut également devenir l'entrée des attaques. Pour éviter les téléchargements de fichiers malveillants, en plus de vérifier le type et la taille des fichiers, les mesures doivent être prises pour empêcher les utilisateurs de télécharger des fichiers PHP exécutables. Par exemple, le téléchargement de types de fichiers tels que .php et .exe est interdit, ou enregistrer des fichiers téléchargés dans des répertoires qui ne sont pas exécutés.

 $disallowed_extensions = ['php', 'exe'];
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if (in_array(strtolower($file_extension), $disallowed_extensions)) {
    echo "Ce type de fichier est interdit";
    exit;
}

4.6 Utilisez une méthode de stockage sécurisée

Stockez les fichiers et les données dans un endroit sécurisé et assurez-vous que les fichiers téléchargés sont correctement isolés et protégés. Au lieu de stocker les résultats de sérialisation de l'ensemble des données du fichier, vous pouvez utiliser la base de données pour stocker les métadonnées du fichier téléchargé (tels que les chemins de fichier, les hachages, etc.).

5. Résumé

Lors de la combinaison de la fonction Serialize () avec la fonction de téléchargement de fichiers, vous devez faire attention aux problèmes de sécurité. Des facteurs tels que les attaques de désérialisation, le type de fichier et la vérification de la taille, les méthodes de stockage de fichiers, etc. nécessitent tous une conception et une protection strictes pendant le processus de développement. En utilisant les meilleures pratiques, nous pouvons assurer la sécurité des téléchargements de fichiers, empêchant ainsi les utilisateurs malveillants d'exploiter les vulnérabilités.


Ce qui précède est la meilleure pratique pour utiliser en toute sécurité la fonction Serialize () dans PHP et le combiner avec le téléchargement de fichiers. Si vous avez des questions, n'hésitez pas à demander!