Position actuelle: Accueil> Derniers articles> Description du problème de l'utilisation de zip_read () pour invalider les fichiers zip cryptés

Description du problème de l'utilisation de zip_read () pour invalider les fichiers zip cryptés

M66 2025-06-05

Dans PHP, lors du fonctionnement des fichiers ZIP, nous utilisons souvent la fonction zip_read () , qui appartient à une partie de la classe Ziparchive et est principalement utilisé pour traverser et lire les entrées de fichiers dans le package ZIP. Cependant, lors de la rencontre d'un fichier zip crypté, de nombreux développeurs constatent que la lecture avec zip_read () échoue ou ne peut tout simplement pas accéder au contenu chiffré. Alors pourquoi est-ce? Cet article combinera le mécanisme d'extension ZIP de PHP pour analyser les causes de ce problème et ses solutions en détail.

1. Phénomène à problème

 $zip = zip_open('encrypted.zip');
if ($zip) {
    while ($entry = zip_read($zip)) {
        echo zip_entry_name($entry) . "\n";
        if (zip_entry_open($zip, $entry)) {
            echo zip_entry_read($entry, zip_entry_filesize($entry));
            zip_entry_close($entry);
        }
    }
    zip_close($zip);
}

Le code ci-dessus fonctionne normalement lors de la lecture d'un fichier zip normal, mais lors de la rencontre d'un fichier zip crypté, les problèmes suivants se produisent souvent:

  • Incapable de lire le contenu du fichier, zip_entry_read () renvoie une chaîne vide ou une erreur.

  • Il ne peut même pas traverser à aucune entrée de fichier, qui se manifeste comme zip_read () renvoie false .

2. Analyse des causes profondes

zip_read () appartient à l'ancienne interface de la bibliothèque Libzip de PHP (opérations de bas niveau basées sur des fichiers zip) et ne prend pas en charge le déchiffrement nativement du contenu des fichiers cryptés. Les fichiers zip cryptés (généralement protégés par mot de passe) utilisent la méthode de cryptage des données de fichiers, et les données ne sont pas simplement stockées en texte brut.

  • zip_read () ne peut accéder qu'à des entrées de fichiers et à des contenus de fichiers non cryptés dans les fichiers ZIP.

  • Si le fichier zip est chiffré, l'extension ZIP doit appeler la logique de décryptage correspondante pour lire correctement le fichier en fournissant le mot de passe correct.

  • Zip_read () de PHP ne fournit pas de paramètres de mot de passe et ne prend pas en charge le décryptage automatique.

En bref, zip_read () ne prend pas en charge la lecture de fichiers chiffrés dans la conception.

3. Correction: utilisez la fonction de décryptage de mot de passe de la classe ziparchive

L'extension zip de PHP, qui commence par la version 7.2, fournit une classe ziparchive plus complète, qui prend en charge les mots de passe des paramètres pour lire les fichiers chiffrés:

 $zip = new ZipArchive();
$res = $zip->open('encrypted.zip');
if ($res === true) {
    // Définir le mot de passe
    $zip->setPassword('your_password');
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $stat = $zip->statIndex($i);
        echo "File: " . $stat['name'] . "\n";

        $stream = $zip->getStream($stat['name']);
        if (!$stream) {
            echo "Failed to open stream for {$stat['name']}\n";
            continue;
        }

        $contents = stream_get_contents($stream);
        fclose($stream);
        echo $contents;
    }
    $zip->close();
} else {
    echo "Failed to open zip file\n";
}

Remarques clés:

  • La méthode setpassword () est utilisée pour fournir le mot de passe requis pour le décryptage.

  • Utilisez getStream () pour obtenir le flux de contenu du fichier crypté, à condition que le mot de passe est correct.

  • Cette méthode peut lire normalement les contenus de fichiers zip cryptés.

4. Résumé

  • zip_read () est une interface de fonctionnement zip dans PHP dans les premiers jours et ne peut pas traiter les fichiers cryptés.

  • Les fichiers zip cryptés doivent utiliser des interfaces qui prennent en charge le décryptage du mot de passe, telles que Ziparchive.

  • Avec Ziparchive :: SetPassword () , PHP peut s'ouvrir et lire avec succès les fichiers chiffrés.

  • Dans le développement réel, il est recommandé d'utiliser la classe Ziparchive lors de la rencontre de fichiers ZIP cryptés pour éviter d'utiliser ZIP_READ () .