Avatarupload Sicherheit

BSA

Erfahrenes Mitglied
Hi Leute!

Ich bin gerade dabei endlich mal mein Avatar-Uploascript zu vervollständigen. Es hat bisher immer nicht so richtig geklappt.
Ich würde gerne wissen ob es so unsicher ist wenn ich das Script so benutzen würde:

  • Ich überprüfe mittels eines hidden fields ob die Datei größer ist als 20 KB --> wenn, dann Script abbruch
  • Dann verschiebe ich die Datei in einen extra angelegten Ordner. Die Dateiendung bekommt dann einen Anhang (*.php___ oder *.jpg___), sodass wenn jemand irgendein Script hochläd, das nicht ausführen kann.
  • Dann überprüfe ich den Dateityp mit getimagesize() --> wenn Dateityp nicht jpg, png oder gif ist Script abbruch
  • Dann überprüfe ich die Bildmaße (90 x 90 px) --> wenn größer, Script abbruch
  • Wenn alles richtig war, kopiere ich die Datei aus dem Ordner in den Zielordner mittels copy() und gebe der Datei den Namen der User id des Users

Wäre nett wenn jemand der Ahnung hat dazu mal seinen Kommentar abgeben könnte.

Gruß BSA
 
Ich glaube, Du machst es zu umständlich.
Die Datei wird doch zunächst temporär abgelegt. Diese temporäre Datei kannst Du auslesen, aber nicht von außerhalb ausführen. Daher musst Du sie nicht erst kopieren und ihr einen Namen mit neuer Endung geben.
Die Dateigröße musst Du nicht mit irgendwelchen hidden inputs übermitteln (die vom User gefälscht werden können), wie auch immer Du die Dateigröße in das hidden input bekommst, sondern kannst sie im supoblobalen Array $_FILES auslesen.
[phpf]getimagesize[/phpf] kannst Du auf die temporäre Datei anwenden.

Mehr steht im Manual unter Steuerung von Dateiuploads.

Gruß hpvw
 
Hi!

Also bei mir konnte ich getimagesize() nicht auf die Temproräre Datei Anwenden, und genau das war der Punkt warum ich mir die selber aus dem Temp Ordner in eien eigenen Temp Ordner geschoben habe.

Die Dateigröße über prüfe ich mit:

Code:
<input type="hidden" name="MAX_FILE_SIZE" value="20480" />

Und das ist auch eine gängige Methode wie ich denke!
 
BSA hat gesagt.:
Hi!

Also bei mir konnte ich getimagesize() nicht auf die Temproräre Datei Anwenden, und genau das war der Punkt warum ich mir die selber aus dem Temp Ordner in eien eigenen Temp Ordner geschoben habe.
Wenn das so ist, dann musst Du wohl die Datei kopieren. Ich würde dennoch den temporären Dateinamen beibehalten, da Du damit sicher bist, dass Du keine Datei überschreibst, wenn z.B. zwei User gleichzeitig ihre Datei "avatar.jpg" hochladen.

BSA hat gesagt.:
Die Dateigröße über prüfe ich mit:

Code:
<input type="hidden" name="MAX_FILE_SIZE" value="20480" />

Und das ist auch eine gängige Methode wie ich denke!
Das bringt IMHO überhaupt nichts, ebenso, wie die Angabe einer maximalen Dateigröße im File-Input-Attribut. Sichere Kontrolle bietet entweder den Wert im Array $_FILES auszulesen oder mit [phpf]filesize[/phpf] die Größe der Datei zu prüfen.
Clientseitige Beschränkungen helfen lediglich, die User davor zu bewahren, unnützerweise zu große Dateien hochzuladen, da es in den meisten Fällen der Browser unterbindet. Ein versierter User wäre dennoch in der Lage mit einem eigenen Programm größere Dateien an das auswertende Skript zu senden.

Gruß hpvw
 
Hallo!

Ich verwende in meinen Projekten immer eine solche Funktion, um einen einzigartigen Dateinamen für das Tmp-Verzeichnis zu erstellen:
PHP:
function get_tmp_filename($extension = '') {
	global $config;
	do {
		srand((double)microtime() * 1000000);
		$tmp_filename = md5(uniqid(rand()));
		if (!empty($extension))
			$tmp_filename .= '.'.$extension;
		} while (file_exists($config['paths']['root_server'].$config['paths']['temp_dir'].$tmp_filename));
	touch($config['paths']['root_server'].$config['paths']['temp_dir'].$tmp_filename);
	chmod($config['paths']['root_server'].$config['paths']['temp_dir'].$tmp_filename, 0777);
	return $config['paths']['root_server'].$config['paths']['temp_dir'].$tmp_filename;
	}
Und dann sage ich einmal im Script
PHP:
$tmp_file = get_tmp_filename();
if (@move_uploaded_file($_FILES['upload']['tmp_name'], $tmp_file)) {
und führe dann die notwendigen Operationen aus.

Ich hoffe, das konnte dir helfen.

Mamphil
 
PHP hat für alles Funktionen, auch zum ermitteln eines eindeutigen Dateinamens: [phpf]tempnam[/phpf].
Das muss man nicht selber schreiben.

Gruß hpvw
 
Mamphil hat gesagt.:
Aber wer kennt schon alle PHP-Funktionen? ;)
Keiner, aber man kann eigentlich immer erstmal davon ausgehen, dass die kleineren Hilfsfunktionen, die man sich gerade schreiben will bereits in PHP vorhanden sind. Um dem Verdacht nachzugehen, kann man dann in die Funktionsreferenz schauen.

Gruß hpvw
 
Zurück