PHP Neue PHP Version ... Bildupload funktioniert nicht

Hattrix

Cadet 4th Year
Registriert
März 2007
Beiträge
111
Hallo,

PHP:
$file = $HTTP_POST_FILES['userfile']['name'];
$path_parts = pathinfo($file);
Wird der Dateiname und Erweiterung nicht erkannt, den man in einem input-Feld ja sucht und einfügt, um dann auf den Button "upload" zu klicken. Script mal vollständig:
PHP:
	$filename = ""; 
	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 = "bild_" . $mitglied[id_u] . "." . $path_parts["extension"];
		$dest = $path.$filename;

		if(substr($filename,-4,4)=='.jpg' || substr($filename,-4,4)=='.gif')
		{
			copy($temp, $dest);
			echo 'Bild wurde gespeichert!';
		}
		else
		{
			echo 'Es sind nur die Bildformate "jpg" oder "gif" zulässig!';
		}

	}

Alte Version:
PHP Version 5.2.6-0.dotdeb.1

Neu Version:
PHP Version 5.2.5 (x64)
 
Ich musste einen Providerwechsel vornehmen und dort ist die PHP-Version niedriger und Server ist eigener Root Windows Server.

Und auf dem neuen Server funktioniert das Script leider nicht. :(
 
Vermutlich hängt dein Problem mit den Einschränkungen des Safe-Modes zusammen. Diese treten bei copy() auf, bei move_uploaded_file() aber nicht! Außerdem würde ich einfach die $_FILES-Variable nutzen, denn $_HTTP_POST_FILES ist seit langem deprecated/veraltet (nur für PHP < 4.1.0 nötig).
 
Danke Berni.

Ich habe $_HTTP_POST_FILES in $_FILES geändert und es funktioniert wieder.
 
Worauf ich eigentlich hinaus wollte: poste bitte demnächst auch den Fehlercode, der dir angezeigt wird. Der ist derjenige, der dir sagt, was falsch ist.

Falls dir nix angezeigt wird, bau in der ersten zeile nach dem <?php folgendes ein:

PHP:
error_reporting(E_ALL);
 
und noch was zur sicherheit, das script is kreuzgefährlich....
da kannste schön codefiles mit phpcode drin hochschieben und mit bissl glück produzierst du irgendwo im restlichen code ne lfi lücke, und schon hast du den supergau.
entweder mit finfo (http://de2.php.net/manual/en/book.fileinfo.php) arbeiten oder wenigstens auf das bild nen getimagesize draufpacken, wenn du die gd lib zur verfügung hast. aber auf jeden fall das ganze mehr absichern, als nur über den filename!
 
Stimmt, das sollte auch erwähnt werden. Hatt ich garnid mehr dran gedacht, danke easteregg. Allerdings nutzt er PHP 5.2.x - da gibt es fileinfo() nur als PECL Extension, erst ab PHP 5.3 ist fileinfo() standardmäßig mit an Board.


Auch die Namensvalidierung stinkt ein wenig, da sie case-sensitive arbeitet und auch nicht die Endung jpeg berücksichtigt. Es gibt aber User, die auch .JPG oder .GIF uploaden - die würde das Script verweigern.

Ich muss gestehen, ich hab grad keine Lust den Code nochmal live zu testen, theoretisch müsste er aber funktionieren, sowohl Groß/Kleinschreibung-berücksichtigend als auch Bildvalidierend. Und falls der Upload nicht den kriterien entspricht -> tempupload-datei sicherheitshalber löschen.


PHP:
// array für erlaubte Dateiendungen
$allowed_extensions = array("jpeg","jpg","gif");

    $filename = ""; 
    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 = "bild_" . $mitglied[id_u] . "." . $path_parts["extension"];
        $dest = $path.$filename;

        // check ob das bild auch wirklich ein Bild ist
        $imgvalid = (exif_imagetype($HTTP_POST_FILES['userfile']['tmp_name'])) ? true : false;

        // check ob Dateiendung des Uploads im Array der erlaubten 
        // Dateiendungen enthalten und ob das Bild valide ist.
        if(in_array(strtolower($path_parts["extension"]), $allowed_extensions) && $imgvalid === true)
        {
            copy($temp, $dest);
            echo 'Bild wurde gespeichert!';
        }
        else
        {
            //Temp-Upload löschen! Sonst haste maybe Datenmüll.
            unlink($temp);

            echo 'Es sind nur die Bildformate "jpg" oder "gif" zulässig!';
        }

    }
 
Zuletzt bearbeitet:
copy is btw auch blöd - sonst haste nämlich ganz sicher und nicht nur "maybe" Datenmüll

move_uploaded_file() ist die Lösung :p
 
Zurück
Oben