schreibrechte prüfen
Roger
- php
moin!
ich habe mir gerade eine funktion geschrieben, die die schreibrechte auf eine datei überprüfen soll (damit das Script in die Datei schreiben kann). kann man diese evtl. auch noch verbessern, oder habe ich was übersehen/falsch gemacht?
function checkFile($datei)
{
global $fehler, $ermsg;
if (file_exists($datei))
{
clearstatcache();
$chmod = decoct(fileperms($datei));
if (strpos($chmod, "766") === false)
{
$ermsg.= "Die Datei ".$datei." ist nicht beschreibbar! (Bitte chmod(766)!)<br>";
$fehler++;
}
}
else
{
$ermsg.= "Die Datei ".$datei." fehlt.<br>";
$fehler++;
}
}
das ganze sollte nat. nur aufgerufen werden, wenn es auf einem unix-system aufgerufen wird. die überprüfung dazu sollte evtl. vorher ablaufen.
gruß.
roger.
Moin moin!
kann man diese evtl. auch noch verbessern,
Ich denke schon http://de3.php.net/manual/de/function.is-readable.php
Gruß aus Berlin!
eddi
Moin moin!
kann man diese evtl. auch noch verbessern,
Ich denke schon http://de3.php.net/manual/de/function.is-readable.php
Oh - oh. Falscher Fehler: http://de3.php.net/manual/de/function.is-writable.php
Gruß aus Berlin!
eddi
Hello,
vergiss aber nicht, dass diese Prüfung immer nur einen Snapshot darstellt.
Zwischen Deiner Prüfung und der tatsächlichen Benutzung der Datei vergeht ja Zeit, in der die Datei von einem anderen Prozess durchaus beseitigt, umbenannt, gegen Schreiben geschützt ode gesperrt werden kann.
Es ist daher besser, Du stattest Deine Scripte mit genügend eigener Intelligenz aus, indem Du
ini_set('track_errors','1');
setzt. Dann steht Dir bei IO-Operationen anschließend die Variable $php_errormsg zur Verfügung. Sie enthält dann im Fehlerfall die Fehlermeldung.
Da PHP da aber selber eine kleine logische Macke hat, musst Du die Variable mit
if(isset($php_errormsg)) prüfen.
Sie verschwindet nämlich bei fehlerloser Operation manchmal einfach so... ;-)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
moin!
Ich denke schon http://de3.php.net/manual/de/function.is-readable.php
die funktion hatte ich anfangs beim wickel. allerdings konnte sie mir auf meinem benutzten server (apache 1.3.31 auf linux, mit php4.3.7) nicht wirklich helfen. ich bekam keine ausgabe - weder positiver noch negativer art...
gruß.
roger.
Hi,
if (strpos($chmod, "766") === false)
auch wenn es bessere Lösungen gibt, wie die anderen in diesem Thread bereits erklärt haben, möchte ich dich trotzdem auf einen kleineren Denkfehler aufmerksam machen: Es kann genauso gut sein, dass eine Datei mit chmod 777 ausgestattet ist, oder auch 776 oder so - und du kannst sie dennoch beschreiben; nur so am Rande...
E7
moin!
hm. da haste recht :)
aber wenn man per manual den user darauf hinweist, die datei bitte mit 766 auszustatten, kann man die funktion so verwenden :)
hm, ginge es vielleicht nicht auch, die zahl zu vergleichen? dass man abfragt $chmod > 766? theoretisch ja, oder gibts einwände? bei 770 müsste das script die datei doch auch beschreiben können, oder?
gruß.
roger.
Hello,
aber wenn man per manual den user darauf hinweist, die datei bitte mit 766 auszustatten, kann man die funktion so verwenden :)
Man sollte mit den Dateirechten nicht so schlampig umgehen und auch nicht mit den Gruppenzugehörigkeiten. Einen Webserver für mehrere Benutzer sinnvoll einzurichten ist auch nicht so ganz leicht.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
moin!
hm, was ist daran schlampig, den user zu bitten, für den schreibzugriff auf die datei die rechte kurzfristig zu ändern?
mir ging es in erster linie einfach darum, die schreibrechte, die zum schreiben in eine datei auf dem server benötigt werden zu überprüfen. was ist jetzt daran schlampig?
gruß.
roger.
Hello,
hm, was ist daran schlampig, den user zu bitten, für den schreibzugriff auf die datei die rechte kurzfristig zu ändern?
mir ging es in erster linie einfach darum, die schreibrechte, die zum schreiben in eine datei auf dem server benötigt werden zu überprüfen. was ist jetzt daran schlampig?
Noch habe ich nicht behauptet, dass DU schlampig mit den Rechten umgehst. Der Thread ist ja schließlich noch nicht beendet. ;-)
Nur wenn keine Antwort auf meine Fragen kommt, kann ich auch keinen Rat geben.
Es ist eben notwendig, verscheidene Dinge zu wissen, damit wir hier mit ein bis zwei Seiten auskommen und kein Buch schreiben müssen.
Wenn diese Daten bekannt sind, kann man (voraussichtlich) eine qualifizierte Hilfestellung geben.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
moin!
vielleicht verwechselst du da gerade was. ich habe kein problem mit rechten. und was ich für eine sys-config habe, sei auch dahingestellt. mir ging es zunächst darum, eine allgemeingültige funktion zu basteln, die überprüft, ob das script die datei beschreiben darf oder nicht. ich wollte wissen, ob man die funktion evtl. verbessern kann - für die nachwelt.
gruß.
roger.
Hello Roger,
vielleicht verwechselst du da gerade was. ich habe kein problem mit rechten. und was ich für eine sys-config habe, sei auch dahingestellt. mir ging es zunächst darum, eine allgemeingültige funktion zu basteln, die überprüft, ob das script die datei beschreiben darf oder nicht. ich wollte wissen, ob man die funktion evtl. verbessern kann - für die nachwelt.
Ich habe da nichts verwechselt, sondern wollte nur auf die Interna von is_writable() eingehen.
Du hast in Deinem OP versucht, die Beschreibbarkeit der Datei mittels einer Funktion zu prüfen, die nur auf Dateirechte-Flags Rüchsicht nimmt, nicht aber auf
Die Bugs in den unterschieldichen Systemen lassen wir mal außen vor. Aber deshalb fragte ich danach.
is_writetable() nimmt auch auf die Einstellugnen des SafeMode Rücksicht und ermittelt die effektiven Rechte. Das hast Du mit Deiner Funktion nicht gemacht.
Da ich vorhin aber für einen anderen Thread (timeout von Scripten, PHP-Background-Scripte) sowieso noch etwas mit SafeMode austesten musste, habe ich diese Aufgabe auch nochmals gecheckt und es ist genau das dabei herausgekommen, was ich erwartet hatte.
Nimm also entweder is_writable() oder benutze 'track_errors'='1' und $php_errormsg in Verbindung mit einem Schreibversuch. Ein Öffnungsversuch im passenden Modus müsste es auch tun (Linux)
$fh = @fopen($dateiname,'a+'); ## a+ ist zwar zerstörungsfrei, aber nicht mehr für
if (!$fh) ## Änderung vorhandener Daten nutzbar
{
Echo 'File ist not writable: '.(!empty($php_errormsg)?$php_errormsg:''));
{
Wenn Du gleich den passenden Openmode nimmst, kannst Du anschließend gleich mit dem handle weiterarbeiten. 'a+' erlaubt seit PHP version > 4.3.3 (?) auch unter Linux nicht mehr das hineinschreiben in den Altbereich der Datei.
zwischen is_writable() und fopen(...'r+') könnte sich schon wieder ein andere Prozess drängen, der da was ändert. Und dann fällt man doch auf die Nase. Also kann man auch gleich mit der open-Funktion arbeiten.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
bei 770 müsste das script die datei doch auch beschreiben können,
weiß ich jetzt nicht, aber wenn ja: Dann vergleich halt die ersten beiden Stellen ob die >= 76 sind...
E7