Überprüfen Sie die Dateiberechtigungen


14

Wie kann ich file permissions überprüfen, ohne Betriebssystem spezifischen Befehl über passthru() oder exec() ausführen zu müssen?

17

Verwenden fileperms() Funktion

clearstatcache(); 
echo substr(sprintf('%o', fileperms('/etc/passwd')), -4); 

0

Was möchten Sie tun, indem Sie Dateiberechtigungen überprüfen?

Beim Schreiben von Sicherheitscode ist es fast immer falsch, etwas "zu überprüfen, dann zu tun". Der Grund dafür ist, dass zwischen der Überprüfung, ob Sie etwas tun können und es tatsächlich tun, der Zustand des Systems sich so ändern könnte, dass es ein anderes Ergebnis hätte.

Wenn Sie beispielsweise prüfen, ob eine Datei vorhanden ist, bevor Sie eine schreiben, überprüfen Sie nicht, ob Sie die Datei erfolgreich geschrieben haben (oder nicht detailliert genug einchecken) und später vom Inhalt abhängen die Datei, die Sie geschrieben haben, könnten Sie tatsächlich eine Datei lesen, die von einem Angreifer geschrieben wurde.

Also, anstatt Dateiberechtigungen zu überprüfen, tun Sie einfach, was auch immer Sie tun würden, wenn die Berechtigungsprüfung erfolgreich war, und Fehler korrekt behandeln.

+1

Es gibt immer machbar Gründe für die Berechtigungen überprüft, vielleicht er baut einen Daemon zur Befestigung Berechtigungen, die ‚doesn t verlassen sich auf sein Skript, um zu den Akten zu lesen oder zu schreiben, während ein anderer Prozess das tut. 20 mai. 112011-05-20 14:44:56

+1

Ein anderes Beispiel ist ein RewriteMap-Programm, das als ein Gate basierend auf bestimmten Dateiberechtigungen fungiert. 21 mär. 122012-03-21 16:45:08


11

Sie können die Befehle is_readable(), is_executable() usw. verwenden.

+1

Beachten Sie, dass is_writable() die Gruppenmitgliedschaft nicht überprüft (ab PHP 5.5.18). 12 nov. 142014-11-12 22:30:01


1

Verwenden fileperms() Funktion und Teilzeichenfolge:

substr(decoct(fileperms(__DIR__)), -4); // 0777 
substr(decoct(fileperms(__DIR__)), -3); // 777 

Für Datei:

substr(decoct(fileperms(__FILE__)), -4); // 0644 
substr(decoct(fileperms(__FILE__)), -3); // 644 

__FILE__ und __DIR__ mit Ihrem Pfad ersetzen oder variable


6

Wirkliche Kodierer verwenden bitweise Operationen, keine Strings;) Das ist viel elegante Art und Weise der Handhabung Berechtigungen:

function checkPerms($path) 
{ 
    clearstatcache(null, $path); 
    return decoct(fileperms($path) & 0777); 
} 
  0

Was ergibt sich, richtig/falsch? 06 mai. 142014-05-06 16:08:09