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>