Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Passwortgeschützter Upload: Variablenwerte werden vergessen?

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Passwortgeschützter Upload: Variablenwerte werden vergessen?

    Hallo liebe PHP-Experten,

    bis jetzt bin ich mit meinen PHP-Kenntnissen kaum über die include-Funktion hinaus gekommen.
    Deshalb habe ich mir aus diversen Foren und Tutorials ein FTP-Upload-Formular inkl. Kundenlogin zusammen geschustert.

    Bevor ich zum eigentlichen Problem komme, möchte ich erstmal den Code präsentieren.

    In der Datei login.php erfolgt der Kundenlogin.
    PHP-Code:
    <form action="upload.php" method="post">
    <
    table border=0>
    <
    tr>
    <
    td align="left"><strong>Nutzername:</strong></td>
    <
    td align="left"><input type="text" name="nutzer"></td>
    </
    tr>
    <
    tr>
    <
    td align="left"><strong>Passwort:</strong></td>
    <
    td align="left"><input type="password" name="pwd"></td>
    </
    tr>
    <
    tr>
    <
    td>&nbsp;</td>
    <
    td align="left"><input type="submit" name="senden" value="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Absenden&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"></td>
    </
    tr>
    </
    table>
    </
    form
    Die eingegebenen Werte werden dann an die upload.php weitergegeben.
    PHP-Code:
    if ((md5($nutzer) == "rhabarber") and (md5($pwd) == "barbara")) {

    //Wenn Logindaten korrekt sind:
       
    $ftp_server "domain.de";
    $user "bla";
    $password "blubb";
                                            
    $uploaddir "/domain.de/blobb";

    $types "bmp|doc|docx|eps|gif|indd|jpeg|jpg|pdf|png|psd|rar|tif|tiff|ttf|zip";

    $maxsizemb "75";

    echo 
    "<form style=\"margin-left:25px\" action=\"?action=upload\"    enctype=\"multipart/form-data\" method=\"POST\"><input name=\"localfile\" type=\"file\" size=\"50\"><br><input type=\"submit\" name=\"sub\" value=\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Datei hochladen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"></form>";

    $a explode("|"$types);
    $arraypices count($a);
    echo 
    "<p>Folgende Dateitypen können Sie hochladen: <br>";
    for (
    $i 0$i $arraypices$i++) {
            echo 
    "$a[$i],&nbsp;";
    }
    echo 
    "</p>";

    if(
    $_GET['action']=="upload"){
        
    $tempname $_FILES['localfile']['tmp_name'];
        
    $name $_FILES['localfile']['name'];
        
    $type $_FILES['localfile']['type'];
        
    $size $_FILES['localfile']['size'];
        
    $maxsizebytes = ($maxsizemb 1024 1024);
        
    $uploadfile "$uploaddir/$name";
        
    $con ftp_connect("$ftp_server");
        
    $login ftp_login($con"$user""$password");

            if ((!
    $con) || (!$login)) { $err[] = "Die Verbindung zum Server ist fehlgeschlagen."; die; }

    if(!
    preg_match("/\." $types "$/i"$_FILES["localfile"]["name"])) {
            
    $err[] = "Sie haben versucht, einen ungültigen Dateityp hochzuladen. Die Datei wurde nicht gespeichert. Bitte laden Sie nur Dateien mit den erwähnten Endungen hoch."; }

    if(
    $size "$maxsizebytes") {
             
    $err[] = "Die hochzuladende Datei ist größer als die maximal erlaubten $maxsizemb MB.";}

    if(empty(
    $err)){    
        
    $upload ftp_put($con$uploadfile$localfileFTP_ASCII);
        if (!
    $upload) {
        echo 
    "Der Upload ist leider fehlgeschlagen. Sollte das Problem weiterhin bestehen, nehmen Sie bitte Kontakt mit uns auf.<BR><BR>";
                            }
        else {
        echo 
    "Die Datei $name wurde erfolgreich auf unserem Server gespeichert. Vielen Dank.<BR><BR>";
        }
    }

    else {
        foreach(
    $err as $error)
        echo 
    "$error<br>";
        }
                        
    ftp_quit($con);
                    
    }            

    }

    //Wenn Login falsch:

    else {
        echo 
    "<p>Der eingegebene Nutzername oder das Passwort waren nicht korrekt.<BR><A href=\"service.php\">Zurück</A><p>";
        } 
    Nun zu meinem Problem:
    Beim Wechsel von der login.php zur upload.php funktioniert die If-Abfrage oberflächlich: Das Formular wird angezeigt, Dateien können ausgewählt werden und der Upload kann ausgeführt werden.
    Nach/während der entsprechenden Upload-Zeit springt das Skript aber in die Else-Anweisung für die falschen Logindaten.
    Die hochzuladende Datei wurde auch nicht im Zielordner abgelegt bzw. werden keine anderen Fehlermeldungen angezeigt.

    Meine Vermutung ist, dass während des Skriptdurchlaufs die Variablenwerte für $nutzer und $pwd verloren gehen.
    Das Upload-Skript hat im Test ohne PW-Abfrage fehlerfrei funktioniert. Auch Syntaxfehler glaube ich, ausschließen zu können.
    Ich bin mit meinen Experimenten bei der Variablen-Übergabe für die Login-Abfrage einfach am Ende.

    Dementsprechend freue ich mich über Eure Hilfe. Es ist bestimmt nur irgendein banaler Anfängerfehler. Aber genau das bin ich ja auch: ein Anfänger.

    Vielen Dank für Eure Antworten.
    Gruß
    MTBT
    [URL="http://www.trailsandbikes.net"]Trails & Bikes[/URL] - (m)ein Mountainbike Blog


  • #2
    PHP-Code:
    if ((md5($nutzer) == "rhabarber") and (md5($pwd) == "barbara")) { 
    Diese Zeile kann niemals wahr werden, sodass immer in den else-Zweig gesprungen wird!

    PHP-Code:
    if( (md5($nutzer) == md5("rhabarber")) and (md5($pwd) == md5("barbara")) ) { 
    Diese if-Anweisung sollte mit den Benutzerdaten funktionieren, aber diese Nutzung der md5() Funktion ist total sinnlos und kann durch einen einfachen Vergleich von Strings ersetzt werden! Ziel der md5() Funktion ist, dass man NUR den Hashwert speichert, sodass man von diesem Wert nicht auf den Eingabewert schließen und damit das Passwort erhalten kann...

    DAHER: Lerne, was der Sinn des Hashen von Passwörtern ist und was Hashes und Salted Hashes überhaupt sind!

    Kommentar


    • #3
      Hallo Sirke und vielen Dank erstmal für Deine Antwort,

      die Einträge für die MD5-Hashes sind nur schnell hingeworfene Beispieleingaben gewesen. Normalerweise wird dort natürlich der Hash-Wert abgefragt.

      PHP-Code:
      if( (md5($nutzer) == ("Hash$nutzer")) and (md5($pwd) == ("Hash$pwd")) ) { 
      Nun habe ich noch diverse Möglichkeiten mit und ohne Klammern in der If-Abfrage ausprobiert. Leider verlief alles ohne den gewünschten Effekt.

      Zumal zu erwähnen gilt, dass die If-Abfrage bei Übergabe aus der login.php in die upload.php offensichtlich funktioniert. Sonst würde ich nach Eingabe der korrekten Nutzerdaten gar nicht erst den schlauen Spruch und das Formular für die Datei-Auswahl zu sehen bekommen. Oder im Falle einer Falscheingabe die Else-Anweisung ausgeführt bekommen.

      Erst beim Starten des Uploads lädt das Skript, als ob es die Daten auf den Server spielen würde und springt nach einigen Sekunden bis Minuten (je nach Dateigröße) auf die Meldung der Else-Anweisung.
      Habe auch schon akribisch die "{" und "}" durchgeschaut. Wenn ich mich da nicht verzählt habe, sollten diese auch passen.

      Irgendwo beim Durchlauf der If-Anweisung scheinen die Werte von $nutzer und $pwd verloren zu gehen.
      Könnte es evtl. helfen, diese bereits vor der If-Abfrage in andere (lokale?) Variablen zu überführen, um dann mit diesen weiterzuarbeiten?
      Das hatte ich zwar schon probiert, aber vielleicht habe ich dabei "Vokabel-Fehler" gemacht.
      [URL="http://www.trailsandbikes.net"]Trails & Bikes[/URL] - (m)ein Mountainbike Blog

      Kommentar


      • #4
        100% liegt das an der md5() Funktion.

        Diese verschlüsselt deine Eingabe! Deswegen kann Sie niemals "Hash$pwd" sein!

        Mach es so:
        PHP-Code:
         if( ($nutzer == "hans") and ($pwd == "hanspw") ) { 
        Als User gibst du nun "hans" ein und als Passwort "hanspw". Dann sollte es klappen. Zumindest, sofern der andere Code stimmt.

        Kommentar


        • #5
          @Jens P.:
          Da habe ich mich wohl schon wieder etwas missverständlich ausgedrückt. "Hash$nutzer" etc. war wieder nur ein Beispiel. Die Passwortabfrage funktioniert ja mit dem MD5-Hashtag bis zum eigentlichen Upload-Prozess.

          Um jegliche Zweifel daran auszuräumen also nochmal dieser schnipsel:

          PHP-Code:
          // Hash-Werte sind aus Sicherheitsgründen unvollständig
          if( 
                 (
          md5($_POST['nutzer']) == "81f5538d2dc67a811fcd82597df")
              and
              (
          md5($_POST['pwd']) == "d72b7054d7d85d14b85e2c7c8c")
          ){ 
          Der Fehler muss irgenwo im restlichen Code http://www.php.de/php-einsteiger/66065-passwortgeschuetzter-upload-variablenwerte-werden-vergessen.html#post502494]des ersten Post liegen.
          Ich finde ihn bloß leider nicht.

          Bevor Ihr nun den ganzen Code durchrackert beantwortet mir bitte ein paar prinzipielle Fragen. Vielleicht kann ich mir dann selbst weiterhelfen.
          1. Kann es passieren, dass die Werte der benannten Variablen binnen durchlauf des Codes vergessen werden können?
          2. Woran könnte das liegen? (doppelte Vergabe des gleichen Variablennamens habe ich scon überprüft, war negativ)
          3. Müsste ich den ganzen Spaß evtl. einfach in eine Session verpacken?
          4. Wo müsste diese Session beginnen? In der login.php oder reicht der Start in der upload.php?
          [URL="http://www.trailsandbikes.net"]Trails & Bikes[/URL] - (m)ein Mountainbike Blog

          Kommentar


          • #6
            mögliche Antworten:
            1. Nein, sofern sie nicht außerhalb ihres Gültigkeitsbereichs liegen!
            2. Gültigkeitsbereich, Übergabe-Fehler durch Formular?!
            3. Das tut nicht Not und ist für diesen Zweck imho Quatsch.
            4. siehe Punkt 3.

            Ich befürchte den Fehler bei der Übergabe der Parameter.
            Du hast in der upload.php ein weiteres Formular, in der Du eine Datei auswählen kannst
            und per Submit-Button hochlädst.

            Beim Klick auf diesen Submit-Button, werden aber weder Name noch Paßwort erneut mitgesendet,
            so daß es imho logisch ist, daß er sich hier mit Tante ELSE anfreundet...
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche Tutorials

            Kommentar


            • #7
              Hallo Arne,

              genau das war der Fehler! Ich habe das Ganze jetzt erstmal mit dem unverschlüsselten Passwort und Nutzernamen in folgender Form vor dem Submit-Button eingebunden.

              PHP-Code:
              <input type=\"hidden\" name=\"nutzer\" value=\"Wert_nutzer\">
              <input type=\"hidden\" name=\"pwd\" value=\"Wert_pwd\"> 
              Das funktioniert, ist allerdings unverschlüsselt. Wie könnte ich nun in diesen Inputs anstelle des unverschlüsselten Werts die Urprungsvariablen $nutzer und §pwd aufrufen.
              Das müsste ja meines Erachtens wieder in HTML geschehen. Nun stehe ich hier wieder ein bisschen auf dem Vokabelschlauch.

              Nichtsdestotrotz sei Dir schonmal ganz herzlich gedankt. Das grundlegende Problem konnte ich nur mit Deiner Hilfe lösen.

              Gruß
              MTBT
              [URL="http://www.trailsandbikes.net"]Trails & Bikes[/URL] - (m)ein Mountainbike Blog

              Kommentar


              • #8
                Sicher das
                PHP-Code:
                <input type="hidden\" name=\"nutzer\" value=\"Wert_nutzer\">
                <input type=\"hidden\" name=\"pwd\" value=\"Wert_pwd\"> 
                funktioniert?
                Irgendwie wirkt es schon vom Syntax Highlight komisch

                Kommentar


                • #9
                  Ist ein Boardfehler, weil mal wieder unvollständiger Code gepostet wurde.
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Wenn ich Dich richtig verstanden habe meinst Du sowas:
                    PHP-Code:
                    echo '<input type="hidden" name="nutzer" value="'.$wert_nutzer.'" />';
                    // oder auch
                    echo '<input type="hidden" name="nutzer" value="$wert_nutzer" />'
                    Das sind aber Grundlagen, die Du bitte unbedingt lernen mußt...
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche Tutorials

                    Kommentar


                    • #11
                      @ ragtek und nikosch: Ja da hat sich ein kleiner Tippfehler eingeschlichen, der im eigentlichen Code nicht vorhanden ist.

                      @Arne: Nochmal vielen Dank. Ich werde mich auf jeden Fall in nächster Zeit intensiver mit der PHP-Semantik befassen.
                      Die bisherige learning-by-doing-Strategie sorgt halt immer für ein sehr löchriges Programmierwissen. Will sagen: Ich verstehe etwas aufwendigere Skripts, kann sie modifizieren, beim Coding von Anfang an fehlen dann aber wieder die grundlegenden Fähigkeiten.
                      Ich gelobe hiermit Besserung.

                      Diesen Fred könnte man nun eigentlich als gelöst betrachten.
                      [URL="http://www.trailsandbikes.net"]Trails & Bikes[/URL] - (m)ein Mountainbike Blog

                      Kommentar


                      • #12
                        Diesen Fred könnte man nun eigentlich als gelöst betrachten.
                        Jo, dann üben wir gleich mal Grundlagen "Board Verwendung":
                        Gehe auf Thread, siehe rechts neben dem Button "Antworten" den Link "Thema als erledigt markieren" und klicke sinnvoller Weise darauf...
                        Competence-Center -> Enjoy the Informatrix
                        PHProcks!Einsteiger freundliche Tutorials

                        Kommentar

                        Lädt...
                        X