Tom: PhP bilder upload + URL in sql DB

Beitrag lesen

Hello,

ich sehe schon, es wird immer wichtiger, dass ich meinen Artikel im Wiki endlich mal fertig mache.

http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload

Ich würde gerne aus einem Formular heraus einen Bilderupload zulassen. Nun kam ich auf die idee via BLOB bilder in die DB zu speichern, was aber anscheinend nicht sonderlich toll ist.

Das kommt auf Dein Datenmodell an, dass du für die Bilderdatenbank wählst. Und wenn die Bilder kleiner als 100kB sind, dann ist die Datenbank durchaus ein passender Speicherplatz.

Allerdings muss man sich dann "select * from bilder" auf jeden Fall verkneifen, sondern muss eben immer die kleinstmögliche Ergebnismenge erzeugen.

Außerdem kann man die Bilder dann nicht direkt einbinden in einenn HTTP/s-Request. Man benötigt immer ein Script für die Auslieferung. Dieses Script muss dann im Prinzip _sehr_ komplex sein, denn es müsste auch "chunked", "compressed" und "last modified" unterstützen. Das kann jeder übliche Webserver nämlich von Haus aus.

Wenn die Bilder im Filesystem gespeichert werden, muss man darauf achten, dass dar Request auf das Bild auf keinen Fall einen Scriptparser (z.B. PHP, Perl) anschmeißt, der das Bild als ausführbare Datei werten könnte. Damit hat man sich dann sofort eine empfindliche Sicherheitslücke gebaut.

Darum würde ich gerne versuchen das Bild ins filesystem zu laden und die url in die DB zu setzen. Aber ich glaube ich habe einige verständniss probleme, vllt könnt ihr mir helfen:

Gerne.

Beispiel Script von php.net:
[code lang=php]
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir. basename($_FILES['userfile']['name']);
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {

move_uploaded_file() & Co. sind antiquiert. Bei Verwendung des (neuen) superglobalen Arrays $_FILES gibt es andere Möglichkeiten um festzustellen, ob das File hochgeladen wurde. Und diese sollten auch benutzt werden!

Wichtig ist die Einstellung eines eigenen upload_tmp_dir, auf das kein anderer Serveruser des Shared Hosting Zugriff hat und insbesondere NIEMALS ein Client Zugriff erhält (z. B. per HTTP/s). Das würde dann auch den Garaus für den Server bedeuten können.

Das Ablage-Verzeichnis für die Bilder sollte mit "engine off" für den Parser ausgeschaltet werden und die Endungen für die Bilder im Ablageverzeichnis sollten stimmen. Das kann man mit getimagesize() überprüfen und dann selber entsprechend richtigstellen. Ein GIF-Image sollte also auch als ???.gif abgespeichert werden, auch wenn der Client es als *.png oder als *.jpg gesesndet hat.

Derartige Fehler (Endungen passen nicht zum MIME-Type) gibt es auch noch in vielen CMS. Bilder, die durch getimagesize() nicht erkannt werden, sollte man sowieso ablehnen.

Je nachdem, ob PHP als Modul oder als CGI oder FastCGI läuft, muss man noch weitere Sicherheitsmaßnahmen ergreifen.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de