Uploadinterface mit PHP

Polarcat

Super Moderator - 35 ballern in der 50er, Beste
Hardwareluxx Team
Thread Starter
Mitglied seit
11.11.2004
Beiträge
23.283
Ort
Unser Basar
Hallo Leute,
erstmal einmal vorne weg: Ich bin Noob in PHP in der Selbstanlernung und hab mir in meinem Wahnsinn vorgenommen eine Art Uploadinterface für PHP zu zaubern.
Nichts großes, erst einmal für mich zum rumprobieren, der Codeanteil ist ja nicht so wahnsinnig schwer was das angeht, gibt ja auch viele Tuts im Netz.

Meine Frage ( ich hoffe deshalb richtiger Bereich ) ist eher die Sicherheit.

Nehmen wir mal an, ich baue mir eine Seite mit einem einfach Feld zur Dateiauswahl und Uploadbutton, ist ja fix gemacht.
Dann setze ich über PHP ein DestinationDir , move_uploaded_file und verschiebe so den Upload an seinen Zielort. Alles soweit erstmal okay und verständlich.

Mein Problem ist jetzt, dass ich dafür ja ein Verzeichnis für "nobody" mit Schreibrechten versehen muss, wo ich persönlich die Schwachstelle sehe.. Ich kann zwar die Ausführung sperren, aber ist das auch ausreichend? Nach meinem Wissensstand ist ein dermaßen offenes Verzeichnis nie zu bevorzugen. Jemand eine Idee, wie ich das Verzeichnis ausreichend schützen kann ?
Von mir aus auf der Uploadseite auch durch Benutzerkennung + PW geschützt, aber der Download sollte frei verfügbar sein über eine URL.. Das wäre recht gut zu bewerkstelligen. Muss doch aber auch einfacher gehen oder ?


Keine Sorge, ich hab da nichts im Produktiveinsatz und am Netz, bevor hier einen anhand meiner "Unwissenheit" einen Herzinfarkt erleidet.
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Hey,

Du solltest zu allererst einmal deine Upload-Seite mit einem Login sichern. Dazu findest du haufenweise Tutorials und fertige Scripts im Netz. Wenn das geschehen ist, kannst du eigentlich sicher sein, dass niemand der die Zugangsdaten nicht hat an dein Interface ran kommt => Du kannst dem jeweiligen Webserver-Benutzer Rechte für das Upload-Verzeichnis geben.

Entweder das ist das was du suchst oder ich bin zu dumm zum lesen ;)

Grüße
 
Das Interface usw. ist zu sichern, klar.

Die Rechte für das Uploadverzeichnis sind ja mein Problem. Da ich in dem Moment das Verzeichnis nach außen hin öffne für Schreibzugänge, mache ich den Server ja verwundbar. Oder sehe ich da mehr Probleme, als es wirklich gibt ?
Ich meine jetzt mal nicht den Fall, wo ich den Upload für unregistrierte Benutzer vollkommen sperre, den Ansatz habe ich inzwischen auch mehrfach gefunden, ist ja eigentlich auch logisch.
Die Frage ist halt, wenn ich den Upload so reinstelle, dass man auch ohne Kennung rankommt.
 
Zuletzt bearbeitet:
Du öffnest das Verzeichnis doch nur für den Webserver-Benutzer... Es kann doch kein Benutzer deines Interfaces eigenen Code ausführen, oder?

Grüße
 
Hi,

du hast da mehrere Möglichkeiten...

a) Das Verzeichnis in welchen die hochgeladenen Dateien landen, liegt ausserhalb des DOC Root. In diesem Fall kann niemand die Dateien über die Url öffnen. Du müsstest dann ein Download Script schreiben, welches die Dateien per "file_get_contents()" läd und über header(content-type:blafoo) rausbläßt.


PHP:
<?php
$file = $_GET['file'];
header("Content-Disposition: attachment; filename=" . urlencode($file));    
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: Download File $file");             
header("Content-Length: " . filesize($file));
echo file_get_contents($file);

b) Dateien liegen im DOCRoot. Mittels .htaccess Datei ist es möglich, PHP, CGI, etc zu deaktivieren. Dann bekommen die User die Datei eben auch zum Upload.
Für PHP müsstest du z.B. eine .htaccess Datei mit folgenden Inhalt, in Verzeichnis mit den hochgelandenen Dateien packen.

PHP:
php_flag engine off

c) Du verweigerst generell den Upload bestimmter Dateiendungen, auf welche der Webserver eine Scriptsprache mapt. Also z.b. .cgi, .pl, .php, .php3, .php4, .php5, .html, .htm, .phtml, etc..


Gruß
Alex
 
Hm Variante 1 und 2 klingen gut, ich glaube, da lese ich mich mal ein.

Mal noch eine andere Frage, mein Verschiebeteil sieht so aus :

PHP:
<?php
	// Ziel auswählen
	$Ziel = "Uploads/";
	
	//Datei für Zielordner Umbenennen nach Ursprungsdatei
	$Ziel = $Ziel . $_FILES['uploadedfile']['name'];
	
	if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $Ziel)) {
		echo "The file ". $_FILES['uploadedfile']['name'].
		" has been uploaded";
	} else{
		echo "There was an error uploading the file, please try again!";
	}
?>

Auf meiner Windowstestumgebung muss ich den Ordner "Uploads" vorher anlegen, sonst gibt es einen Fehler.
Ich möchte aber später das Skript so erweitern, dass Unterordner angelegt werden können beim Upload.
Wenn ich personalisierte Ordner zulassen und den Namen dann "dynamisch" bei $Ziel eintragen lasse, wird der Unterordner unter Linux dann automatisch angelegt ? Oder muss ich das über den entsprechenden Code vorher veranlassen ?
Die Tut-Seiten widersprechen sich da etwas, die einen sagen es wird automatisch angelegt, manche sagen gar nichts dazu und bei anderen sollen die Ordner vorher angelegt sein..
 
Zuletzt bearbeitet:
Um dein Ordner vorhanden oder nicht Problem zu umgehen, bau doch einfach eine Prüfung ein. d.h. wenn der Ordner nicht vorhanden ist, dann erstelle ihn einfach.
PHP:
if(!is_dir($Ziel)
mkdir($Ziel,0777, TRUE);
 
Dann solltest du evtl. noch den Dateinamen mit basename() filtern, bzw. überprüfen ob der Zielpfad innerhalb des gewünschten Zielverzeichnisses (also "Uploads/") liegt. Sonst könnte ja ein böswilliger Benutzer Dateien auf deinem Server überschreiben (indem er seine Datei "../../../irgendwas.php" nennt). Wenn du eine .htaccess benutzt, solltest du auch überprüfen das niemand eine Datei namens ".htaccess" hochlädt. ;-)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh