Position actuelle: Accueil> Derniers articles> Pourquoi échoue-t-il en raison des problèmes d'autorisation des fichiers lors de l'utilisation de la fonction md5_file ()? Analyse des situations et solutions communes

Pourquoi échoue-t-il en raison des problèmes d'autorisation des fichiers lors de l'utilisation de la fonction md5_file ()? Analyse des situations et solutions communes

M66 2025-06-23

Dans PHP, md5_file () est une fonction très pratique pour calculer la valeur de hachage MD5 du contenu de fichier spécifié. La syntaxe de base est la suivante:

 md5_file(string $filename, bool $binary = false): string|false

Cette fonction est très courante dans le traitement de la vérification des fichiers, du mécanisme de mise en cache, de la vérification de l'intégrité du fichier et d'autres scénarios. Cependant, pendant l'utilisation réelle, les développeurs peuvent rencontrer un problème déroutant: le fichier existe et le chemin est correct, mais md5_file () renvoie false . Ceci est généralement dû à des problèmes d'autorisation des fichiers . Cet article analysera ses causes, ses scénarios communs et ses solutions en détail.


1. Pourquoi md5_file () échoue-t-il en raison de problèmes d'autorisation?

MD5_FILE () essaie en interne de lire l'intégralité du contenu du fichier afin d'effectuer des opérations MD5 dessus. Par conséquent, si les autorisations du script PHP ne sont pas suffisantes pour lire le fichier cible , la fonction renvoie false .

Le point clé est les "autorisations lisibles"

Pour md5_file () , le fichier doit avoir des "autorisations lisibles". Cela comprend les dimensions suivantes:

  • Le fichier lui-même doit être lisible pour l'utilisateur d'exécution actuel (comme www-data ).

  • Tous les répertoires de niveau supérieur doivent avoir des "autorisations d'exécution" (c'est-à-dire qu'elles peuvent être "entrées") afin que PHP puisse accéder au chemin.

  • Les modules de sécurité du système tels que SELINUX, Apparmor peuvent également affecter les droits d'accès.


2. Analyse des scénarios d'erreur communs

1. Paramètres d'autorisation de fichier incorrect

Lorsque l'autorisation de fichier est de 600 (propriétaire lisible et inscrite), si l'utilisateur d'exécution PHP n'est pas le propriétaire du fichier, le fichier ne sera pas lu.

 -rw-------  1 root root  1024 May 28 10:00 secret.txt

Si PHP est exécuté en tant qu'utilisateur www-data , il ne pourra pas lire le fichier ci-dessus et md5_file () échouera.

2. Les autorisations du répertoire auquel il appartient sont insuffisantes

Même si le fichier lui-même a lu l'autorisation, si l'autorisation du répertoire ne permet pas à PHP d'entrer, le fichier ne peut être accessible.

 drwx------  2 user user 4096 May 28 10:00 /var/private/

Dans ce cas, même si le fichier est défini sur 644 , PHP ne peut pas accéder à /var/private/secret.txt .

3. SELINUX OU MODULE DE SÉCURITÉ RESTRICTIONS

Certains systèmes Linux ont SELINUX ou APPARMOR activé, et même si les autorisations de fichier semblent être "normales", elles peuvent être limitées par les politiques système.

Vous pouvez utiliser la commande suivante pour vérifier les limites de SELINUX:

 ls -Z /path/to/file

3. Solution

1. Vérifiez et modifiez les autorisations de fichiers

Assurez-vous que le fichier cible a des autorisations de lecture à l'utilisateur PHP. Le moyen le plus simple consiste à définir les autorisations de fichiers sur 644 et à s'assurer que les utilisateurs de PHP ont également des autorisations au répertoire:

 chmod 644 /path/to/file.txt
chown www-data:www-data /path/to/file.txt

2. Confirmer les autorisations d'accès des utilisateurs de PHP

Vous pouvez déboguer temporairement l'utilisateur exécuteur actuel via le code PHP suivant:

 echo get_current_user(); // Ou utiliser posix_geteuid()

Assurez-vous que l'utilisateur a la permission d'accéder aux fichiers et répertoires cibles.

3. Utiliser is_readable () pour détecter la lisibilité

Avant d'appeler md5_file () , vérifiez si le fichier est lisible pour éviter les erreurs directes:

 $file = '/var/data/file.txt';
if (is_readable($file)) {
    $hash = md5_file($file);
    echo "Hash: $hash";
} else {
    echo "Fichier non lisible,Veuillez vérifier les autorisations";
}

4. Vérifier les politiques de sécurité du système

Si vous êtes sur un système compatible SELINUX, vous devrez peut-être modifier le contexte via la commande CHCON :

 chcon -t httpd_sys_content_t /path/to/file.txt

Ou arrêter temporairement les tests Selinux (non recommandés pour les environnements de production):

 setenforce 0

4. Autres suggestions et précautions

  • Si vous utilisez un CDN ou une adresse distante comme https://m66.net/files/check.txt , md5_file () échouera également. Car il ne peut traiter que des chemins de fichier locaux et ne peut pas traiter les URL. Les fichiers distants peuvent être téléchargés d'abord, puis traités à l'aide des méthodes suivantes:

 error_reporting = E_ALL
display_errors = On