Datei-Erstelling schlägt fehl
maximus_de
- php
Hallo,
mit meinem PHP-Script möchte ich eine xml-Datei erstellen lassen:
<?php
$nickname = isset($_GET['nick']) ? $_GET['nick'] : null;
$password = isset($_GET['pw']) ? $_GET['pw'] : null;
$email = isset($_GET['mail']) ? $_GET['mail'] : null;
$xml = "<"."?xml version='1.0' encoding='ISO-8859-1' ?".">";
$content = "<user>
<name>$nickname</name>
<password>$password</password>
<email>$email</email>
<verified>true</verified>
<aktivated>true</aktivated>
<penaltyDesc>-</penaltyDesc>
<userstate>0</userstate>
<openSecuredArea>true</openSecuredArea>
<autoSupport>false</autoSupport>
</user> ";
if(file_exists("../xml/users/".$nickname.".xml"){
}else{
$newFile = fopen("../xml/users/".$nickname.".xml", "w");
fwrite($newFile, $xml.$content);
fclose($newFile);
}
?>
Aber es funktioniert nicht, keine PHP-Warnung oder -Fehler.
Kann mir irgendwer helfen?
Gruß
Guten Tag,
Aber es funktioniert nicht, keine PHP-Warnung oder -Fehler.
Kann mir irgendwer helfen?
Wie ist dein PHP bzgl. error_reporting und display_errors konfiguriert? Entsprechende Einstellungen kannst du dir mit ini_get() im entsprechenden Skript ausgeben lassen.
Gruß
Christoph Jeschke
Hi!
$newFile = fopen("../xml/users/".$nickname.".xml", "w"); fwrite($newFile, $xml.$content);
a) Existiert der jeweilige Ordner?
b) Sind die Rechte des Ordners so gesetzt, dass du eine Datei erstellen darfst?
mfg
Hello,
mit meinem PHP-Script möchte ich eine xml-Datei erstellen lassen:
<?php
$nickname = isset($_GET['nick']) ? $_GET['nick'] : null;
$password = isset($_GET['pw']) ? $_GET['pw'] : null;
$email = isset($_GET['mail']) ? $_GET['mail'] : null;$xml = "<"."?xml version='1.0' encoding='ISO-8859-1' ?".">";
$content = "<user>
<name>$nickname</name>
<password>$password</password>
<email>$email</email>
<verified>true</verified>
<aktivated>true</aktivated>
<penaltyDesc>-</penaltyDesc>
<userstate>0</userstate>
<openSecuredArea>true</openSecuredArea>
<autoSupport>false</autoSupport>
</user> ";if(file_exists("../xml/users/".$nickname.".xml"){
}else{
$newFile = fopen("../xml/users/".$nickname.".xml", "w");
fwrite($newFile, $xml.$content);
fclose($newFile);
}?>
>
> Aber es funktioniert nicht, keine PHP-Warnung oder -Fehler.
> Kann mir irgendwer helfen?
Sieht jedenfalls gefährlich aus!
Steht denn in $\_GET['nick'] überhaupt etwas drin und WAS könnte drinstehen?
Wenn nichts drinsteht, versuchst Du eine Datei namens '.xml' anzulegen, die vermutlich schon existiert aufgrund vieler vorangegangener Versuche.
Wenn $\_GET['nick'] existiert, könnte trotzdem noch '' drinstehen, oder aber, was bei real existenten Usern eher wahrscheinlich ist, auch mal 'was ganz furchtbar Böses. Das musst Du auf jeden Fall abfangen.
Dann der Punkt mit Prüfung und Nutzung, also "file\_exists()" und "fopen()":
Damit baust Du Dir ein TOCTOU-Problem (<http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use>), also eine nicht behandelte Race-Condition im nebenläufigen Betrieb. Nebenläufigen Betrieb sollte man bei Webapplikationen fast immer haben.
Benutze hierfür den Modus 'x' oder 'xb+' der fopen()-Funktion. Dieser legt die neue Datei nur dann an, wenn sie noch nicht vorhanden war und fopen() liefert im Fehlerfalle eben false und kein gültiges Handle. Das kann man dann auswerten, bevor man die Datei dann EXCLUSIV SPERRT, um sie zu beschreiben. <http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/>
Lieber also mehr Kontrollen einbauen und außerdem in kleine Funktionen zerlegen.
kleines Muster:
function( ... )
{
$fh = fopen('meine\_datei','xb+'); ## hier \_eventuell\_ Fehlermeldung ausschalten
if (!$fh) return false; ## Funktion abbrechen
if flock{$fh, LOCK\_EX)
{
fwrite($fh, $contents);
}
fclose($fh); ## der Ordnung halber \*gg\*
return true;
}
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg

--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Hello,
Benutze hierfür den Modus 'x' oder 'xb+' der fopen()-Funktion. Dieser legt die neue Datei nur dann an, wenn sie noch nicht vorhanden war und fopen() liefert im Fehlerfalle eben false und kein gültiges Handle. Das kann man dann auswerten, bevor man die Datei dann EXCLUSIV SPERRT, um sie zu beschreiben. http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/
Wenn ich dem PHP-Manual hier vertrauen darf, müsste man sich das explizite Sperren der Datei bei Verwendung des Modus 'x' sogar schenken können, weil die Datei vom System exclusiv angefordert wird:
"This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call."
Diese Frage lassen wir aber mal lieber für Christian Seiler offen im Raume stehen :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
