In PHP ist MD5_file () eine sehr praktische Funktion, um den MD5 -Hash -Wert des angegebenen Dateiinhalts zu berechnen. Die grundlegende Syntax ist wie folgt:
md5_file(string $filename, bool $binary = false): string|false
Diese Funktion ist bei der Überprüfung der Datei, dem Caching -Mechanismus, der Überprüfung der Dateiintegrität und anderen Szenarien sehr häufig. Während der tatsächlichen Verwendung können Entwickler jedoch auf ein verwirrendes Problem stoßen: Die Datei existiert und der Pfad ist korrekt, aber Md5_file () gibt falsch zurück. Dies wird normalerweise durch Probleme mit der Dateiberechtigung verursacht. Dieser Artikel wird seine Ursachen, gemeinsamen Szenarien und Lösungen im Detail analysieren.
MD5_FILE () versucht intern, den gesamten Dateiinhalt zu lesen, um MD5 -Vorgänge darauf auszuführen. Wenn die Berechtigungen im PHP -Skript nicht ausreichen , um die Zieldatei zu lesen , gibt die Funktion false zurück.
Für md5_file () muss die Datei "lesbare Berechtigungen" enthalten. Dies beinhaltet die folgenden Abmessungen:
Die Datei selbst muss zum aktuellen Ausführungsbenutzer (z. B. www-data ) lesbar sein.
Alle Verzeichnisse der oberen Ebene müssen "Ausführungsberechtigungen" (dh sie können "eingegeben" werden), damit PHP auf den Pfad zugreifen kann.
Systemsicherheitsmodule wie Selinux, Apparmor kann auch die Zugriffsrechte beeinflussen.
Wenn die Dateiberechtigte 600 (Eigentümer lesbar und schriftlich) beträgt, wird die Datei nicht gelesen, wenn der Benutzer der PHP -Ausführung nicht der Eigentümer der Datei ist.
-rw------- 1 root root 1024 May 28 10:00 secret.txt
Wenn PHP als www-data- Benutzer ausgeführt wird, kann es nicht in der Lage sein, die obige Datei zu lesen , und Md5_file () fehlschlägt fehl.
Auch wenn die Datei selbst die Erlaubnis gelesen hat, kann die Datei nicht zugegriffen werden, wenn die Erlaubnis zur Verzeichnis nicht zulässt, dass PHP eingeben kann.
drwx------ 2 user user 4096 May 28 10:00 /var/private/
In diesem Fall kann PHP auch wenn die Datei auf 644 festgelegt ist, kann auf /var/private/secret.txt zugreifen.
Einige Linux -Systeme sind Selinux oder Apparmor aktiviert, und selbst wenn Dateiberechtigungen "normal" zu sein scheinen, können sie durch Systemrichtlinien eingeschränkt werden.
Sie können den folgenden Befehl verwenden, um die Einschränkungen von Selinux zu überprüfen:
ls -Z /path/to/file
Stellen Sie sicher, dass die Zieldatei dem PHP -Benutzer Berechtigungen gelesen hat. Am einfachsten ist es, Dateiberechtigungen auf 644 festzulegen und sicherzustellen, dass PHP -Benutzer auch Berechtigungen für das Verzeichnis haben:
chmod 644 /path/to/file.txt
chown www-data:www-data /path/to/file.txt
Sie können den aktuellen Benutzer des Executor -Benutzers vorübergehend über den folgenden PHP -Code debuggen:
echo get_current_user(); // Oder verwenden posix_geteuid()
Stellen Sie sicher, dass der Benutzer die Berechtigung hat, auf die Zieldateien und Verzeichnisse zuzugreifen.
Überprüfen Sie vor dem Aufrufen von MD5_File () , ob die Datei lesbar ist, um direkte Fehler zu vermeiden:
$file = '/var/data/file.txt';
if (is_readable($file)) {
$hash = md5_file($file);
echo "Hash: $hash";
} else {
echo "Datei nicht lesbar,Bitte überprüfen Sie die Berechtigungen";
}
Wenn Sie sich in einem selinux -fähigen System befinden, müssen Sie den Kontext möglicherweise über den Befehl CHCON ändern:
chcon -t httpd_sys_content_t /path/to/file.txt
Oder vorübergehend die Selinux -Tests abschließen (nicht für Produktionsumgebungen empfohlen):
setenforce 0
Wenn Sie eine CDN oder eine Remote -Adresse wie https://m66.net/files/check.txt verwenden, schlägt auch Md5_file () fehl. Da es nur lokale Dateipfade verarbeiten kann und keine URLs verarbeiten kann. Remote -Dateien können zuerst heruntergeladen und dann mit den folgenden Methoden verarbeitet werden:
error_reporting = E_ALL
display_errors = On