Moin,
$uploaddir = "/";
$uploadfile = $uploaddir . $_FILES['pfad_grafik']['name'];move_uploaded_file($_FILES['pfad_grafik']['tmp_name'], $uploadfile);
Falls das jemand im Archiv lesen sollte: Auf gar keinen Fall nachmachen. Das ist eine Sicherheitslücke wie sie im Lehrbuch steht. Nie, nie, nie solltet ihr sowas in ein Skript schreiben welches ihr tatsächlich im Internet zugreifbar macht. Auch nichts was so ähnlich aussieht, solange ihr nicht genau wisst was es tut.
Der Grund ist folgender: $_FILES[...]['name'] enthält einen Wert der vom Browser des Benutzers kommt und daher immer als böse und feindlich zu betrachten ist. Da kann der Client reinschreiben was er will, also zum Beispiel auch Sachen die einen "/" enthalten.
In diesem Fall wird das ganze noch offensichtlich schlimmer gemacht dadurch dass du einen "/" davorschreibst, man braucht also nur noch "etc/passwd" in den Namen zu schreiben und der Code würde dann versuchen die hochgeladene Datei nach /etc/passwd zu tun. (Dass das nicht funktionieren wird tut erstmal nichts zu Sache, es gibt noch viele andere Möglichkeiten auf diese Weise das System zu übernehmen.)
ACHTUNG und jetzt das wichtige: Wenn $uploaddir statt dessen auf "/was/weiss/ich/wo" gesetzt worden wäre, wäre das kein Stückchen besser (auch wenn das vielleicht nicht offensichtlich ist), denn der Name könnte ja auch "/../../../../../../etc/passwd" lauten, was am Ende wieder auf das gleiche hinausläuft.
Deswegen bei allen Sachen bei denen eine Eingabe vom User in einen Dateinamen involviert ist, immer Vorkehrungen dagegen treffen. Manche Leute prüfen ob ein "/" (bzw. \ unter Windows) oder ".." im String vorkommt und lehnen ihn dann ab. Das ist im Prinzip ok, meiner Meinung nach aber zu unschön (und hat ein paar Schwächen). Stattdessen schlage ich vor basename() zu verwenden um sicherzugehen, dass der Name wirklich nur ein Dateiname ist und keine Pfadelemente enthält. Und natürlich muß man ein Verzeichnis voranstellen.
Der obige Code sieht also besser so aus:
$uploaddir = "/irgendwo/wo/es/schön/ist/";
$uploadfile = $uploaddir . basename($_FILES['pfad_grafik']['name']);
move_uploaded_file($_FILES['pfad_grafik']['tmp_name'], $uploadfile);
Hier fehlen selbstverständlich noch andere wichtige Elemente; man sollte zum Beispiel den Dateityp und die Endung prüfen ob sie wirklich akzeptabel ist (und bitte, bitte, akzeptiert keine PHP- oder ähnliche Dateien) und bestimmt auch auf die Größe schauen.
Henryk Plötz
Grüße aus Berlin
~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~