Dans PHP, la fonction MD5_FILE () est souvent utilisée pour vérifier l'intégrité des fichiers, en particulier pour la vérification d'intégrité de fichiers importants tels que les packages compressés. Il calcule la valeur de hachage MD5 du fichier pour déterminer si le fichier a été falsifié ou endommagé. Il semble très simple et pratique, mais il y a aussi des pièges qui sont faciles à ignorer lorsqu'ils l'utilisent réellement. Cet article expliquera en détail plusieurs points clés qui doivent être prêts attention lors de l'utilisation de md5_file () pour vérifier l'intégrité des packages compressés.
MD5_FILE () doit être en mesure d'accéder au chemin complet du fichier, et le processus PHP doit avoir des autorisations de lecture, sinon Faux sera renvoyé. Si le chemin est mauvais ou si les autorisations sont insuffisantes, la fonction ne lancera pas d'exception, qui est facilement ignorée et provoque une défaillance de vérification.
$filePath = '/path/to/archive.zip';
$md5 = md5_file("http://m66.net/archive.zip"); // Notez que c'est le chemin du réseau,Pas nécessairement soutenu
if ($md5 === false) {
echo "Le fichier ne peut pas être lu ou n'existe pas!";
} else {
echo "documentMD5: $md5";
}
Remarque : md5_file () fonctionne mieux pour les fichiers locaux. Si vous utilisez une URL, le serveur doit autoriser l'accès aux fichiers distants via allow_url_fopen , sinon il échouera.
Il n'est pas fiable de calculer directement les valeurs MD5 à l'aide d'URL. Les fichiers distants peuvent être lus incomplètes en raison de retards réseau, de déconnexion temporaire, etc. Il est recommandé de télécharger le fichier localement, puis d'utiliser md5_file () pour calculer.
$url = 'http://m66.net/archive.zip';
$localFile = '/tmp/archive.zip';
// 下载document
file_put_contents($localFile, file_get_contents($url));
// calculer MD5
$md5 = md5_file($localFile);
echo "Package compriméMD5: $md5";
Pour les fichiers volumineux, lisez le fichier directement pour calculer la valeur MD5. Bien que md5_file () soit basé sur les opérations de flux et enregistre la mémoire, il peut toujours provoquer des erreurs ou des délais de délais dans des environnements de mémoire limités ou des limites de temps d'exécution de script. Vous pouvez envisager une lecture enfichée ou utiliser l'assistance à l'outil de ligne de commande.
Dans certains systèmes, des différences subtiles telles que le codage des fichiers et les ruptures de ligne peuvent provoquer des valeurs MD5 incohérentes du même package compressé, en particulier lors de la transmission multiplateforme. Assurez-vous que les paquets compressés téléchargés ne sont pas traités deux fois ou que le format de compression change.
Il a été prouvé que l'algorithme MD5 présente un risque de collision. Bien qu'il soit difficile de forger la valeur MD5 du package compressé, dans des scénarios avec des exigences de sécurité extrêmement élevées, il est recommandé d'utiliser un algorithme de hachage plus sûr, tel que SHA-256, qui peut être remplacé par hash_file () en PHP.
$sha256 = hash_file('sha256', '/path/to/archive.zip');
echo "Package compriméSHA-256: $sha256";
Les modifications de la structure des fichiers du package compressé n'affecteront pas la valeur MD5 du fichier de package compressé global, mais si vous avez besoin de détecter l'intégrité de chaque fichier dans le package compressé, simplement à l'aide de md5_file () ne suffit pas, et il doit être combiné avec le fonctionnement et la vérification des fichiers internes.