Bildupload > Verkleinern > in DB

tuFrogs

Mitglied
Hi Leute.

Ich habe vorhin ein Formular erstellt mit dem es möglich ist Daten in eine DB zu speichern. Nun soll es weiterhin möglich sein ein Bild upzuloaden was ebenfalls in die DB eingetragen wird, habe da ein lustiges Skript gefunden:
PHP:
			if (array_key_exists('img', $_FILES))
			{
				$tmpname	= $_FILES['img']['tmp_name'];
				$type		= $_FILES['img']['type'];
				$hndFile	= fopen($tmpname, "r");
				$bildgr		= addslashes(fread($hndFile, filesize($tmpname))); }
$bildgr würde dann in die Datenbank eingetragen.

Nun brauche ich diese Grafik aber noch als Thumbnail. Nun reichen meine Fähigkeiten leider nicht aus meine beiden gefundenen Skript funktionstüchtig zu kombinieren.

Bisher habe ich das:
PHP:
			if (array_key_exists('img', $_FILES))
			{
				$tmpname	= $_FILES['img']['tmp_name'];
				$type		= $_FILES['img']['type'];
				$hndFile	= fopen($tmpname, "r");
				$bildgr		= addslashes(fread($hndFile, filesize($tmpname)));
				
				$size		= getimagesize($tmpname);
				$width		= $size[0];
				$height		= $size[1];
				$height_th	= 72;
				
				if($height < $height_th)
				{
					$height_th = $height;
				}
				
				$skal		= $height/$height_th;
				$width_th	= intval($width/$skal);
				
$Originalgrafik = ImageCreateFromJPEG($tmpname);
$Thumbnailgrafik = ImageCreateTrueColor($width_th, $height_th);
ImageCopyResized($Thumbnailgrafik, $Originalgrafik, 0, 0, 0, 0, $width_th, $height_th, $width, $height);
ImageJPEG($Thumbnailgrafik, "thumb_".$tmpname);

Weiß grad absolut nicht weiter..

Kann ich jetzt aus dem:
ImageJPEG($Thumbnailgrafik, "thumb_".$tmpname);

dieses hier machen:
ImageJPEG($Thumbnailgrafik, $tmpname);

und dann:

$hndFile = fopen($tmpname, "r");
$bildkl = addslashes(fread($hndFile, filesize($tmpname)));

$bildkl dann in die DB:confused:
 
Das Problem wird höchstens sein dass du keine Schreibrechte so auf das temp-Verzeichnis hast. Aber du könntest ImageJPEG so belassen. Dann genau so lesen und in die DB schreiben wie du geschrieben hast. Und das Vorschaubild dann mit unlink wieder löschen.
 
Du solltest daran denken, dass addslashes() nur dann korrekt funktioniert, wenn magic_quotes_gpc auf dem Server deaktiviert ist UND wenn der Datenbankserver zufälligerweise eine mit addslashes() kompatible Escape-Syntax verwendet, was überhaupt nicht sicher ist. Außerdem überprüfst du nicht, ob die im $_FILES-Array angegebene Datei tatsächlich eine hochgeladene Datei ist, was einem böswilligen Hacker Tür und Tor öffnet. Was ich damit sagen will: In der jetzigen Form ist dein Skript sehr fehleranfällig und unsicher. In der PHP-Dokumentation kannst du zu diesen Themen einige Informationen finden!

-Gawayn
 
Also ich habe gerade mal nachgeschaut.
magic_quotes_gpc ist aktiv

Das heißt also das die Eingaben automatisch escaped werden und ich Funktion addslashes() weglassen sollte..

So, wie soll/kann ich nun Prüfen ob die Eingabe eine Datei/Quellcode ist?
 
Das Problem wird höchstens sein dass du keine Schreibrechte so auf das temp-Verzeichnis hast. Aber du könntest ImageJPEG so belassen. Dann genau so lesen und in die DB schreiben wie du geschrieben hast. Und das Vorschaubild dann mit unlink wieder löschen.

Wie meinst du das? Wenn ich keine Schreibrechte im TMP-Verzeichnis hätte könnte ich ja gar keine Dateien hochladen!?
 
Zu den Schreibrechten:

Doch, eine Datei könntest du auch ohne Schreibrechte hochladen, weil der Upload vom Webserver vorgenommen wird, der seinerseits nämlich sehr wohl Schreibrechte besitzt. Der PHP-User hingegen hat sie unter Umständen nicht, so dass dein Skript dann nicht funktioniert.

Zum Thema Dateiuploads => Blick in die PHP-Dokumentation werfen.

http://www.php.net/manual/en/features.file-upload.php

Zum Thema addslashes():

Es kann auch Webserver geben, auf denen magic_quotes_gpc deaktiviert ist. Dann muss man sehr wohl escapen. Daher sollte dein Skript das prüfen!

Außerdem solltest du bei dieser Gelegenheit auch das addslashes() ersetzen gegen die jeweilige escape-Funktion deines Datenbankservers.

-Gawayn
 
Gut, hat sich erledigt. Habe gerade Google nach dem Thema ausgesaugt und da es wohl Einbußen in der Performance geben wird lasse ich das und speichere die Bilder als Dateien auf dem Server ab.. Danke euch trotzdem!
 
Ich habe da doch noch eine Frage. Mit folgendem Skript lade ich nun das Bild hoch und speichere es auf dem Webserver.

PHP:
	if($HTTP_POST_FILES['userfile']['tmp_name'] <> 'none')
	{
		$file		= $HTTP_POST_FILES['userfile']['name'];
		$temp		= $HTTP_POST_FILES['userfile']['tmp_name'];
		$path_parts = pathinfo($file);
		$filename	= 'plakat_' .$jahr.$monat.$tag. '_' .$name. '_' .$ort. '.' .$path_parts["extension"];
		$dest		= $path.$filename;
		copy($temp, $dest);
	}

Wenn ich nun das Bild durch ein anderes ersetzen will, bekomm ich da Probleme? Von wegen Datei bereits vorhanden? Wie mache ich das, damit es ersetzt wird?
 
Es gibt keine Probleme, die copy()-Funktion überschreibt bereits vorhandene Dateien. Allerdings hast du die Sicherheitsprobleme noch nicht behoben!
 
Ich danke dir das du mich darauf aufmerksam machst/gemacht hast. Aber das ganze findet in einem Admin-Bereich statt und ich glaube nicht das derjenige der das mal verwalten wird schädlichen Code einzufügen versucht..

Auch wüsste ich ehrlich gesagt nicht wie ich das sicher machen könnte, mal abgesehen vom escapen der Eingabe, aber das macht der Server ja von sich aus..
 
Zurück