Dateiuploadfeld mit bilder vorschau dynamisch

Bei move_uploaded_file musst du auch aufpassen! Du solltest nicht einfach den Namen, den der Browser dir übergeben hat (und dann in $_FILES landet), übernehmen! Inwieweit PHP da selbst filtert, weiß ich gerade selber nicht. Ein Szenario, welches ich mir vorstellen könnte, wäre, dass der Name auf eine x-beliebige Datei zeigt und diese einfach von move_uploaded_file überschrieben wird!

Die einfache Lösung: Erzeuge einen MD5-Hash der Datei und benutze diesen als Dateinamen.

PS: Falls ich manchmal vielleicht etwas zu forch rüberkomme, dann verstehe mich bitte nicht falsch. Ich möchte dir auch nur helfen und die Sicherheit deiner Skripte und deiner Nutzer verbessern ;)
 
ach quatsch. Wenn ich es so verstehe, werde ich es auch sagen :)

Wie gesagt, ich bedanke mich ganz herzlichst bei dir wegen deiner Hilfe und für die vielen Tipps.

Das mit den datei namen als MD5 hash ist eine sehr gute Lösung und Tipp.

Ich zeig dir mal mir jetzt mit var_dum raus gekommen ist
 
Ach hier ist die ausgabe.

Also ich sehe da keinen Fehler, eig. genau so wie es sein sollte oder?
Code:
array(1) {
 ["files"]=> array(5) {
 	 ["name"]=> array(11) { 
     	[0]=> string(20) "IMG_0016.JPG (2).JPG" 
        [1]=> string(20) "IMG_0015.JPG (2).JPG"
        [2]=> string(0) "" 
        [3]=> string(0) "" 
        [4]=> string(0) "" 
        [5]=> string(0) "" 
        [6]=> string(0) "" 
        [7]=> string(0) "" 
        [8]=> string(0) "" 
        [9]=> string(0) "" 
        [10]=> string(0) "" 
        } 
    ["type"]=> array(11) { 
    	[0]=> string(10) "image/jpeg" 
        [1]=> string(10) "image/jpeg" 
        [2]=> string(0) "" 
        [3]=> string(0) "" 
        [4]=> string(0) "" 
        [5]=> string(0) "" 
        [6]=> string(0) "" 
        [7]=> string(0) "" 
        [8]=> string(0) "" 
        [9]=> string(0) "" 
        [10]=> string(0) "" 
        } 
    ["tmp_name"]=> array(11) { 
    	[0]=> string(33) "/webspace/--/-----/temp/php1OQsz9" 
        [1]=> string(33) "/webspace/--/-----/temp/phpZlMpnb" 
        [2]=> string(0) "" 
        [3]=> string(0) "" 
        [4]=> string(0) "" 
        [5]=> string(0) "" 
        [6]=> string(0) "" 
        [7]=> string(0) "" 
        [8]=> string(0) "" 
        [9]=> string(0) "" 
        [10]=> string(0) ""
        } 
    ["error"]=> array(11) { 
    	[0]=> int(0)
    	[1]=> int(0) 
        [2]=> int(4) 
        [3]=> int(4) 
        [4]=> int(4) 
        [5]=> int(4) 
        [6]=> int(4) 
        [7]=> int(4) 
        [8]=> int(4) 
        [9]=> int(4) 
        [10]=> int(4) 
        } 
    ["size"]=> array(11) { 
    	[0]=> int(1660531) 
        [1]=> int(1831364) 
        [2]=> int(0) 
        [3]=> int(0) 
        [4]=> int(0) 
        [5]=> int(0) 
        [6]=> int(0) 
        [7]=> int(0) 
        [8]=> int(0) 
        [9]=> int(0) 
        [10]=> int(0) 
    } 
  } 
}
 
Zuletzt bearbeitet von einem Moderator:
Das war mal wieder eine blöde Idee von mir, dir var_dump() zu empfehlen. Es liefer zwar einigermaßen schöne Ausgaben, doch ein Array zum Testen des Codes kann ich daraus nicht ohne Weiteres zurückgewinnen.
Kannst du das bitte nochmal mit serialize() (oder json_encode()) anstatt var_dump() machen?

Im Moment kann ich dir aber schon Folgendes zu deinem Code sagen (mein Stand ist der von meinem Beitrag #17):

1.) Folgender Codeblock ist sinnlos, da du schon am Anfang der foreach-Schleife prüfst, ob der Error-Code gleich 0 (=UPLOAD_ERR_OK) ist.
PHP:
if ($_FILES["files"]["error"][$key] > 0) {
  echo "Return Code: " . $_FILES["files"]["error"][$key] . "<br />";
}

2.) In deinem SQL-Query musst du Anführungszeichen um Strings einsetzen. Du hast gar keine!
PHP:
$bildereintrag = "INSERT INTO blogbilder (username, blogtitelbild, rest_blogbilder) values ($_username, $pfadb2, $pfadb)";
PHP:
$bildereintrag = "INSERT INTO blogbilder (username, blogtitelbild, rest_blogbilder) values ('$_username', '$pfadb2', '$pfadb')";

3.) Zwar rufst du, falls das vorherige Query fehlschlägst, mysql_error() und mysql_errno() auf, aber die bringen dir ohne eine explizite Ausgabe ihrer Rückgabewerte gar nichts:
PHP:
mysql_error();
mysql_errno();
PHP:
// Normalerweise sollten echte Fehlermeldungen (trigger_error) erzeugt werden
// Hier aber nur per var_dump
// Du bekommst dann natürlich nichts mit, wenn das System irgendwann einmal live ist. Dann sieht nur der Nutzer die Fehlermeldung oder evtl. ein potentieller Angreifer
var_dump(mysql_error());
var_dump(mysql_errno());

Übrigens können username, pfadb2 und pfadb (bzw. alle Werte, die du irgendwie als Strings in ein Query einfügst) keine Anführungszeichen enthalten, da die sonst im Query einen Syntaxfehler erzeugen würden. Auch deswegen solltest du unbedingt Prepared Statements oder mysql(i)_real_escape_string nutzen.

PS: Ich habe deinen Dateiinhalt in den Beitrag reineditiert.
 
Guten Morgen,

das mit den anführungszeichen, habe ich bis jetzt nie gemacht und hat immer geklappt.

Übrigens können username, pfadb2 und pfadb (bzw. alle Werte, die du irgendwie als Strings in ein Query einfügst) keine Anführungszeichen enthalten

ist mir auch aufgefallen und habe ich auch schon gemacht.

OK, habe mich nämlich schon gewundert, das er mir mal was ausgibt und manchmal nicht. vergesse immer wieder ein echo oder print oder ähnliches einzusetzen.

Mit serialize(), unserialize() und json_encode(); kam keine rückmeldung raus.

Doch eine Sache sehe ich mitlerweile, dass es ein UPLOAD_ERROR gibt, da bei der abfrage, das else ausgeführt wird. Nur wie bekomme ich den Fehlerbericht der UPLOAD_ERROR her?
 
Warning: move_uploaded_file() expects parameter 1 to be string, array given in /webspace/16/73872/probe.brokatmedia.de/blog_speichern.php on line 108

Warning: mkdir(): File exists in /webspace/16/73872/probe.brokatmedia.de/blog_speichern.php on line 81

bei dem error_reporting ist mir jetzt dass hier ausgespuckt worden. Nur was genau bedeut es?
 
Es hat endlich geklappt. :D

Der Fehler lag beim move_uploaded noch, da war es so geschrieben $_FILES["files"]["tmp_name"] anstatt so $_FILES["files"]["tmp_name"][$key]. Es hat einfach das blöde $key gefehlt -.-
 
Eine Sache frage ich mich noch bzw. wollte ich dich bitten ob du mir zwei beispile geben kannst, wie du es mienetest mit dem MD5 und den mysql_real_escape_string.

Ich wollte diese jetzt mal einbauen jedoch, stehe ich gerade vor der frage, wo und wie?
 
Mit serialize(), unserialize() und json_encode(); kam keine rückmeldung raus.
Das hast dir selbst schon beantwortet ;)
vergesse immer wieder ein echo oder print oder ähnliches einzusetzen.

Das Hashen des Dateinamens ist nur bedingt anwendbar, da du eine Kollision bei gleichen Dateinamen hast. Die einfachste Lösung wäre es, die Datensatz-ID aus deiner Datenbank zu nehmen. Diese ist garantiert eindeutig. Dazu kannst du mysql_insert_id() verwenden.

PHP:
$_username = mysql_real_escape_string($_username);
/* ... */
$bildereintrag = "INSERT INTO blogbilder (username, blogtitelbild, rest_blogbilder) values ('$_username', ..., ....)";
Pass aber auf, dass du die maskierte Variable ($_username) nicht im weiteren Verlauf des Codes wiederverwendest, sonst kannst du dort unschöne Zeichen (\) drin haben.
 
Zuletzt bearbeitet:
Zurück