Hans Bäurle: Dateiupload mit PHP unter Win2000/IIS

Hallo PHP-Gurus,

wahrscheinlich klingt Euch meine Frage schon irgendwie in den Ohren. Dennoch hab ich trotz stundenlangem Stöbern noch keine befriedigende Antwort auf mein Problem bekommen. Ich hoffe, es kann mir jemand weiterhelfen.
Ich entwickle unter Win2000 + PHP 4.2.3 + IIS und versuche gerade einen Dateiupload einzurichten. Es geht schon damit los, dass er meine Variable aus dem <input type="file"> nicht kennt, obwohl ich die Seite an sich selbst poste und sogar versuche, über $_POST an die Variable ranzukommen. Das geht komischerweise nur, wenn ich im <form>-Tag anstelle von 'enctype' den Begriff 'accept-type' verwende. In folgendem Mini-Skript funkt dann alles, bis auf den 'copy':

$name = basename($pic); // mein input type heisst 'pic'
$dir_path = "../uploads/";
$img_path = $dir_path.$name;

if(@copy($pic,$img_path)) {
    echo '<script>alert("'.$img_path.'");</script>';
    echo '<script>alert("'.$pic.'");</script>';
}

else {
    echo '<script>alert("NIX WARS");</script>';
}

Ergebnis: NIX WARS !

VIELEN DANK FÜR EURE HILFE!!!

  1. Moin Moin !

    http://selfhtml.teamone.de/html/formulare/datei_upload.htm gelesen und beachtet ?

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    Für eine bessere Übersichtsdarstellung des Forums: http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2
    1. Moin Moin !

      http://selfhtml.teamone.de/html/formulare/datei_upload.htm gelesen und beachtet ?

      Alexander

      Hallo Alexander,

      danke für die schnelle Rückantwort.

      Ich bin mir nicht ganz sicher auf was Du rauswillst ;-)
      Eigentlich hab ich alles so, wie es dort beschrieben ist, schicke sogar noch ein hidden-field mit der max_file_size mit...

      Einziger Unterschied: accept-type statt enctype, aber sonst erkennt er mir die gepostete variable halt nicht.

      Hilf mir mal auf die Sprünge ;-)

      Thx & Greetz

      1. Moin Moin !

        http://selfhtml.teamone.de/html/formulare/datei_upload.htm gelesen und beachtet ?

        Einziger Unterschied: accept-type statt enctype, aber sonst erkennt er mir die gepostete variable halt nicht.

        Das enctype-Attribut ist wichtig, ohne den richtigen ENCTYPE sendet der Browser die Datei einfach nicht. accept-type gbt es nicht. Das accept-Attribut darfst Du gerne zusätzlich angeben, aber der Browser darf sich auch gerne einen Dreck um das accept-Attribut scheren.

        schicke sogar noch ein hidden-field mit der max_file_size mit

        Und wie soll der Browser kapieren, daß das hidden-Feld mit dem File-Upload-Feld zusammenhängt? Du kannst dem File-Upload-Feld noch ein maxlength-Attribut mitgeben, aber auch das darf der Browser zu 100% ignorieren. Die Dateigröße mußt Du auf dem Server prüfen.

        Und bevor Du fragst: Den "Browse"- oder "Durchsuchen"- oder "..."-Button des File-Felds kann man nicht beeinflussen.

        Du hast http://selfhtml.teamone.de/html/formulare/datei_upload.htm nicht wirklich gelesen, bestenfalls überflogen, fürchte ich.

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
        Für eine bessere Übersichtsdarstellung des Forums: http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2
        1. Moin nochmal

          Siehst Du, gerade das ist ja mein Problem. Wenn ich enctype="multipart/form-data" schreibe, kann ich im PHP-Part auf die Variable nicht mehr zugreifen, weil sie dann einfach nicht mehr existiert und genau nach dem 'warum' suche ich ;-)

          max_file_size in einem hiden-field, das dem <input type="file"> voransteht kann sich übrigens in PHP durchaus auf eine maximale Dateigröße beziehen, natürlich muss ich dann die tatsächliche Größe serverseitig (in PHP) abprüfen, indem ich die tatsächliche Dategröße mit dem Wert aus max_file_size vergleiche ;-)

          1. Moin nochmal

            Siehst Du, gerade das ist ja mein Problem. Wenn ich enctype="multipart/form-data" schreibe, kann ich im PHP-Part auf die Variable nicht mehr zugreifen, weil sie dann einfach nicht mehr existiert und genau nach dem 'warum' suche ich ;-)

            Hallo,

            versuche es mal mit $_FILE[....], statt $_POST[...] um die Variable abzuholen.

            Gruß
            René

            1. Hallo,

              versuche es mal mit $_FILE[....], statt $_POST[...] um die Variable abzuholen.

              Gruß
              René

              Hallo René,

              Dir auch erstmal danke für die Rückmeldung. Leider hat Dein Ansatz auch nicht funktioniert (ich lasse mir mit ein paar alerts dann die Variablen ausgeben, aber sobald ich 'enctype' einsetze sind diese leer). Ich habs auch schon mit $GLOBALS["pic"]; und $HTTP_POST_VARS versucht - ohne Erfolg.

              1. Hallo!

                Dir auch erstmal danke für die Rückmeldung. Leider hat Dein Ansatz auch nicht funktioniert (ich lasse mir mit ein paar alerts dann die Variablen ausgeben, aber sobald ich 'enctype' einsetze sind diese leer).

                das ist auch richtig so!

                Ich habs auch schon mit $GLOBALS["pic"]; und $HTTP_POST_VARS versucht - ohne Erfolg.

                Der Tipp mit $_FILES war doch schon nicht schlecht, hast DU das mal probietr? Bevor Du was anderes machst, probier mal
                <?php
                  print_r($_FILES);
                ?>

                Und danach liest Du mal http://www.dclp-faq.de/q/q-formular-upload-php4.html. So sollte man das machen und nicht anders.

                Grüße
                Andreas

          2. Moin Moin !

            Siehst Du, gerade das ist ja mein Problem. Wenn ich enctype="multipart/form-data" schreibe, kann ich im PHP-Part auf die Variable nicht mehr zugreifen, weil sie dann einfach nicht mehr existiert und genau nach dem 'warum' suche ich ;-)

            PHP-Doku zu File-uploads lesen oder warten, bis ein PHP-Experte auftaucht. ;-)

            max_file_size in einem hiden-field, das dem <input type="file"> voransteht kann sich übrigens in PHP durchaus auf eine maximale Dateigröße beziehen, natürlich muss ich dann die tatsächliche Größe serverseitig (in PHP) abprüfen, indem ich die tatsächliche Dategröße mit dem Wert aus max_file_size vergleiche ;-)

            Das willst Du nicht wirklich. Du erlaubst einem Angreifer, selbst die max_file_size zu setzen. Nehmen wir an, Dein Script kommt mit max. 1 MByte klar. Ich setze mit einem eigenen Formular (kopiert aus Deinem) die max_file_size auf 1 GByte und schiebe Dir eine 50 MByte-Datei ins Script. Dein Script kann es nicht merken, denn die Dateigröße ist ja kleiner als max_file_size. *Kaboooooooom*

            Diesen Fehler hat Microsoft übrigens bei der Password-Prüfung unter Win9x eingebaut. Man braucht nur alle 255 (sinnvollen) Kombinationen eines 1 Zeichen langen Strings ausprobieren und schon hat man Zugriff: Sie haben das richtige Password und das übergebene Password Zeichen für Zeichen verglichen, über die gesamte Länge des übergebenen (nicht des richtigen!!!) Passwords. Davor fehlte wohl eine Abfrage, ob die Längen gleich sind (denn dann macht der Code wenigstens etwas Sinn).

            Alexander

            --
            Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
            Für eine bessere Übersichtsdarstellung des Forums: http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2
            1. PHP-Doku zu File-uploads lesen oder warten, bis ein PHP-Experte auftaucht. ;-)

              Jaup, wird mir wohl nichts anderes übrig bleiben. Trotzdem vielen Dank für Deine/Ihre Hilfe!

              Diesen Fehler hat Microsoft übrigens bei der Password-Prüfung unter Win9x eingebaut. Man braucht nur alle 255 (sinnvollen) Kombinationen eines 1 Zeichen langen Strings ausprobieren und schon hat man Zugriff: Sie haben das richtige Password und das übergebene Password Zeichen für Zeichen verglichen, über die gesamte Länge des übergebenen (nicht des richtigen!!!) Passwords. Davor fehlte wohl eine Abfrage, ob die Längen gleich sind (denn dann macht der Code wenigstens etwas Sinn).

              Alexander

              Ajo, na dann bin ich ja in 'bester' Gesellschaft, wenn das selbst den Profis passiert.

              Greetz,
              Hans