x-plosiv: datei hochladen jpg

hallo liebe forumleser ...ich habe schon wieder ein problem

ich möcht ein einfaches script schreiben um fotos auf meinen server zu laden.

es klappt auch bei allen dateien die ich getestet habe wie zb. gif, doc, pdf. aber ich will eigentlich jpg hochladen.
es gibt mit auch keine fehlermeldung weder auf der seite noch auf dem server log.

ich verstehe die welt nicht mehr....ich weiss dieses script ist nicht das sicherste, aber mich nimmt wunder warum es bei jpg nicht klappt, damit ich den durchblick von grund auf erhalte.

besten dank für eure hilfe

<form enctype="multipart/form-data" action="upload.php" method="post">
<input name="file" type="file"><br>
<input type="submit" value="hochladen">
</form>

<?php
@$tempname = $_FILES['file']['tmp_name'];
@$name = $_FILES['file']['name'];
@$type = $_FILES['file']['type'];
@$size = $_FILES['file']['size'];
if($type != "application/pdf" && $type != "image/gif") {
$err[] = "nur pdf und gif Dateien dürfen hochgeladen werden.";
}
if($size > "1000000") {
$err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 1 MB!";
}
If(empty($err)) {
copy("$tempname", "../test/$name");
echo "Die Datei $name wurde erfolgreich hochgeladen!";
}
else {
foreach($err as $error)
echo "$error<br>";
}

wenn ich diese zeile :
if($type != "application/pdf" && $type != "image/gif") {

ersetze mit:
if($type != "image/jpeg" && $type != "image/gif") {

klappt es zwar mit dem gif....jedoch nicht mit dem jpg...

irgendwie erkennt er die endung jpg nicht

:-(

  1. ersetze mit:
    if($type != "image/jpeg" && $type != "image/gif") {

    Lass Dir den 'Type' mal ausgeben, vielleicht stößt Du dort auf ein 'image/pjpeg'

    1. jep...genau das spuckt er aus...und was sagt mir das jetzt?

      besten dank für deine hilfe

      1. Hallo,

        jep...genau das spuckt er aus...und was sagt mir das jetzt?

        Das soll Dir sagen das Du Dich nicht auf den er- und übermittelten Mimetype Deines Browsers verlassen kannst weil der Server ein Dateiformat möglicherweise anders kennt. In Deinem Fall jpeg vs. pjpeg).

        if($type != "image/jpeg" && $type != "image/gif") {

        Wenn es sein muss dann nimm eine Kombination aus der Dateiendung und einem Teilstring von $type (beinhaltet $type irgendwo "jpeg") und prüfe das ab. Weitere Infos zu den Mimetypen: http://selfhtml.teamone.de/diverses/mimetypen.htm

        Grüsse AndreD

        1. Hello,

          es ist überhaupt kein Problem, irgendwelche Files als jpg auszugeben, und die dann hochzuladen. Vielleicht schafft man es dann sogar noch, diese Files irgendwie zur Ausführung auf dem Server zu bewegen. Dann hast Du eine schöne Sicherheitslücke. Der Server sollte daher den Typ des Files selber überprüfen. Das kan man bei Bildern mit PHP mittels getimagesize()
          http://de3.php.net/manual/de/function.getimagesize.php machen und auf Linux-Servern gibt es i.d.R. das schlaue Programm file, das wirklich fast jeden Typ kennt. Und wenn man sich ausführbare (compilierte) Programme schützen will, dann hilft es, in den ersten 256 Bytes des Files nach einer ASCII-0 zu suchen. Wenn eine drin ist, wird es mit hoher Sicherheit keine HTML-Datei sein.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. Hallo,

            Das kan man bei Bildern mit PHP mittels getimagesize()
            http://de3.php.net/manual/de/function.getimagesize.php

            Hab ich schon mal irgendwo gelesen aber selbst noch nie benötigt. Danke für den Hinweis!

            ...und auf Linux-Servern gibt es i.d.R. das schlaue Programm file, »» das wirklich fast jeden Typ kennt.

            Kann man das mittels exec() auf dem Server aufrufen und für solche Zwecke verwenden?

            Und wenn man sich ausführbare (compilierte) Programme schützen will, dann hilft es, in den ersten 256 Bytes des Files nach einer ASCII-0 zu suchen. Wenn eine drin ist, wird es mit hoher Sicherheit keine HTML-Datei sein.

            Ok, d.h. ich kann das hochgeladene File per PHP auslesen und die ersten 256 Zeichen auf ein ASCII-0 durchsuchen? Da ich Dateiuploads bisher nur für Adminbereiche eingesetzt habe, hatte ich bisher noch nicht die Notwendigkeit gesehen das so genau zu checken. Aber ok, guter Tipp, werde ich mir merken und beim nächsten mal auch anwenden, bzw. bestehende Scripte entsprechend umschreiben.

            Danke & Gruß,
            AndreD

            1. Hello,

              ...und auf Linux-Servern gibt es i.d.R. das schlaue Programm file, »» das wirklich fast jeden Typ kennt.

              Kann man das mittels exec() auf dem Server aufrufen und für solche Zwecke verwenden?

              Ja, man sollte es aber als Kopie im User_exec_dir (oder wie das genau heißt...) ablegen. Schau mal in der INI nach.

              Und dann sollte man noch einige Sicherungen einbauen, um auch den Fehlercode des Programms abfragen zu können. Man muss einige Parameter setzen, damit die Ausgabe vernünftig verwertbar wird in PHP aber das steht alles in der Hilfe und in man von file.

              Wahrscheinlich wirst Du system() benutzen müssen, da exec() mMn nur die letzte Zeile von der Ausgabe zurückgibt.

              Und wenn man sich ausführbare (compilierte) Programme schützen will, dann hilft es, in den ersten 256 Bytes des Files nach einer ASCII-0 zu suchen. Wenn eine drin ist, wird es mit hoher Sicherheit keine HTML-Datei sein.

              Ok, d.h. ich kann das hochgeladene File per PHP auslesen und die ersten 256 Zeichen auf ein ASCII-0 durchsuchen? Da ich Dateiuploads bisher nur für Adminbereiche eingesetzt habe, hatte ich bisher noch nicht die Notwendigkeit gesehen das so genau zu checken. Aber ok, guter Tipp, werde ich mir merken und beim nächsten mal auch anwenden, bzw. bestehende Scripte entsprechend umschreiben.

              Das ist zwar keine Garantie dafür, dass es nicht ein Script ist, aber man kann zumindest schon mal die direkt Prozessor ausführbaren Progs abfangen und die Prüfung geht schnell. Einfach

              ...
              fread($fh,$block,256);

              if (strpos($block,chr(0))!== false)
              {
                ## böses Programm
                exit;
              }

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              1. Hi Tom,

                Ja, man sollte es aber als Kopie im User_exec_dir (oder wie das genau heißt...) ablegen. Schau mal in der INI nach.

                Ich schau es mir bei Gelegenheit mal an.

                Wahrscheinlich wirst Du system() benutzen müssen, da exec() mMn nur die letzte Zeile von der Ausgabe zurückgibt.

                Stimmt, dann also system().

                Das ist zwar keine Garantie dafür, dass es nicht ein Script ist, aber man kann zumindest schon mal die direkt Prozessor ausführbaren Progs abfangen und die Prüfung geht schnell. Einfach

                Ja, so in etwa hätte ich mir das auch ausgedacht ;-)

                Grüsse AndreD