Ankündigung

Einklappen
Keine Ankündigung bisher.

Richtiger Benutzer, aber Passwort wird nicht erkannt

Einklappen

Neue Werbung 2019

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

  • Richtiger Benutzer, aber Passwort wird nicht erkannt

    Hallo zusammen,

    nachfolgend beschreibe ich euch mein derzeitiges Problem mit meinem Login-Script für einen Admin-Breich.

    Kurz zur Vorgeschichte, habe einige Suchanfragen hier und auf html.de durchgeführt, bin aber bisher nicht fündig geworden
    (zb. md5 hash, hash vergleich, nur md5, passwort vergleich, etc)

    So, hier erst mal der Code, wo das Problem auftritt
    PHP-Code:
    case "login":

                if (isset(
    $_POST['submit'])) {

                    
    //Daten sammeln
                    
    $name $_POST['name'];
                    
    $pass $_POST['pass'];
                    
    $pass5 hash("sha256",$pass);
                    
    $path "user/.htusers";

                    echo 
    "Anmeldedaten: "$name ."/"$pass5 ."<br />\n";

                    
    //Benutzerdatei auslesen
                    
    if ($file fopen($path"r")) {
                        while (
    $line fgets($file)) {
                            if (!
    strstr($line"#")) {

                                
    $user explode(":"$line);
                                
    $users['name'][] = $user[0];
                                
    $users['pass'][] = $user[1];
                            }
                        }
                    }

                    
    $valUser count($users['name']);
                    echo 
    "Benutzeranzahl: "$valUser"<br />\n";

                    echo 
    "<p>";

                        
    //Alle Benutzer durchgehen
                        
    for ($i=0$i<$valUser$i++) {

                            echo 
    $users['name'][$i] ."/"$users['pass'][$i] ."<br />\n";

                            if (
    $name == $users['name'][$i]) {
                                echo 
    "Benutzer gefunden<br />\n";

                                
    //Hier ist das Problem!!
                                //######################
                                
    if ($pass5 == $users['pass'][$i]) {
                                    echo 
    "Passwort stimmt<br />\n";
                                    break;
                                } else {
                                    echo 
    "Passwörter stimmen nicht überein<br />\n";
                                }
                            }
                        }

                    echo 
    "</p>";
                }
            break; 
    Das Problem sieht nun wie folgt aus, in der Benutzerdatei sind Name, sowie das Passwort als Hash(sha256) hinterlegt und diese werden auch ohne Probleme ausgelsen und in ein asoziatives Array gespeichert.

    Beim durchgehen des Arrays prüfe ich zunächst, ob der Benutzername vorhanden ist, das funktioniert auch noch, aber beim prüfen, ob das eingegebene Passwort(gehasht) mit dem aus der Datei übereinstimmt fängt das script an zu spinnen.

    Nur beim letzten aufgeführten Benutzer wird das Passwort akzeptier und dass kann ich mir irgendwie nicht erklären.

    Folgende Ausgabe kann ich verzeichnen
    Code:
    Anmeldedaten: <Benuztzer1>/9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    Benutzeranzahl: 2
    
    Daten aus der Benutzer-Datei
    <Benutzer1>/9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    Benutzer gefunden
    Passwörter stimmen nicht überein
    <Benutzer2>/b3d90f7378551190a061a8ca3c55c2269289f02bbe28d7856128d885d6fb3007
    Wie ihr seht, stimmen die gehashten Passwörter bei Eingabe und aus der Datei bei <Benutzer1> überein.

    Bei <Benutzer2> passt es dann komischerweise wieder
    Code:
    Anmeldedaten: <Benutzer2>/b3d90f7378551190a061a8ca3c55c2269289f02bbe28d7856128d885d6fb3007
    Benutzeranzahl: 2
    
    Daten aus der Benutzer-Datei
    <Benutzer1>/9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    <Benutzer2>/b3d90f7378551190a061a8ca3c55c2269289f02bbe28d7856128d885d6fb3007
    Benutzer gefunden
    Passwort stimmt
    Das ganze hatte ich auch zuvor schon mit MD5 probiert und dann auch noch einmal komplett neu geschrieben.

    Langsam weiß ich nicht mehr weiter, kann mir einer sagen woran es leigen kann oder seh ich nur den Wald vor lauter Bäumen nicht?

    Noch zur Info Ich habe auf meinem Localhost XAMPP 1.73 mit Apache Server 2.2 und PHP 5.3.1 als portable App laufen.

    Ich hoffe es gibt jemanden da drau0en, der mir weiterhelfen kann.

    mfg sascha

  • #2
    a) Falsches Forum -> Anfänger
    b) Warum keine MySQL-Datenbank?

    Kommentar


    • #3
      Wenn das eine Anfängerfrage ist, hättest die doch beantworten können!? :P

      Schau mal ins manual da steht folgendes:
      Zitat von php.net
      Gibt eine Zeile bis zu length -1 Bytes Länge zurück, welche aus der Datei von der aktuellen Position des Dateizeigers handle aus ausgelesen wird. Die Zeile endet an einem Zeilenumbruch (welcher im Rückgabewert enthalten ist), EOF (Ende der Datei) oder bei length - 1 Bytes (je nachdem, was eher auftritt). Ist keine Länge angegeben, wird diese auf 1k bzw. 1024 Bytes gesetzt.
      Also ändere einfach diese Zeile
      PHP-Code:
      $users['pass'][] = $user[1]; 
      in diese Zeile ab
      PHP-Code:
      $users['pass'][] = substr$user[1], 064 ); 
      und dann sollte das ganze funktionieren! Ich hoffe du verstehst wo der Fehler war und warum das beim letzten Datensatz richtig ist?

      Kommentar


      • #4
        Hallo skey-z, dein Dateiformat hat einige Macken und die Handhabung dessen ist, sagen wir - Inkonsistent. Da du scheinbar gänzlich auf ein bereits ethabliertes Dateiformat oder eine bestimmte Storage-Engine ( MySQL ) verzichten möchtest würde ich dir hier ein bis zwei Tipps und Möglichkeiten aufzeigen, die dir gewährleisten das dein Format sich relativiert in dem du speicherst und dir die notwendige validität permanent gewährleistet die notwendig ist um solche Daten zu handhaben.

        Angelehnt an die vorangegangene Diskussion über die Methodik eines Konfigurations-Files, leih ich mir die selbe Methode mal zur Speicherung von Nutzerdaten aus. Generell Arbeitet auch das htdocs-Management des Apache Webservers auf einer ähnlichen Ebene, dort werden ebenfalls Konfigurationsdateien als Permanent-Speicher für Nutzerdaten benutzt ( .htuser / .htgroup ). Der Vorteil wird sein das du dein komplettes Dateiformat nicht abändern oder großartig Code umstellen musst um dort bspw. Daten anzuhängen.

        PHP-Code:
        // storage Function: loadUserArray($file) - # Lesen
        function loadUserArray($file) {
           if ( 
        is_readable($file) ) {
              return include(
        realpath($file));
           }
        }

        // storage Function: saveUserArray($file, $array) - # schreiben
        function saveUserArray($file, array $array) {
           
        file_put_contents($file'<'.'?php return '.var_export($array));
        }

        // Lookup Function: lookupUser($username, $storage ) - # suchen
        function lookupUser($username, array $storage) {
           if ( 
        array_key_existshash('sha1'$username), $storage ) {
              return 
        $storagehash('sha1'$username) ];
           }
           else return 
        false;
        }

        // Edit Function: editUser($username, $data, $storage) - # ändern / anlegen
        function editUser($username, array $data, array &$storage) {
           
        $storagehash('sha1'$username) ] = $data;
        }

        // Presetting Function: createUserData($username, $password) - # valide daten erzeugen
        function createUserData($username$password) {
           return array(
              
        'username' => (string)$username,
              
        'password' => (string)$password
           
        );
        }

        // Checking Function: compareLoginData($username, $password, array $lookedUpData) - # vergleichen
        function compareLoginData($username$password, array $lookedUpData) {
           
        $fetch = array('username''password'); $fetch array_flip($fetch);
           
        $userdata array_intersect_keys($lookedUpData$fetch); // username & password absplitten
           
        $submittedData createUserData($username$password);
           if ( 
        $userdata === $submittedData ) return true// vergleichen
           
        else return false;

        testdaten:
        PHP-Code:
        $filename 'userdata.do-not-inc.php';

        $storage = array();

        $createThisUsers = array(
           
        createUserData('testuser1'md5('test')),
           
        createUserData('testuser2'md5('test')),
           
        createUserData('testUser3'md5('test'))
        );

        foreach ( 
        $createThisUser as $user editUser($createThisUser['username'], $createThisUser$storage);

        saveUserArray($filename$storage); 
        usage:
        PHP-Code:
        $filename 'userdata.do-not-inc.php';

        $storage loadUserArray($filename);

        $webLoginData array_intersect_keys$_POSTarray_flip(array('username''password')) );

        if ( isset(
        $webLoginData['username'], $webLoginData['password']) ) {
           
        $webLoginData['password'] = md5($webLoginData['password']);

           
        $result compareLoginData(
              
        $webLoginData['username'], 
              
        $webLoginData['password'], 
              
        lookupUser($webLoginData['username'], $storage)
           );

           if ( 
        $result ) {
               
        /* login daten sind korrekt */
           
        }
           else {
              
        /* oder auch nicht */
           
        }

        So, den schwierigeren Teil der Sessionverwaltung überlass ich mal dir ^^

        Seh das hier als "bonus-hilfe", viele Anfänger brechen sich unheimlich die Finger beim verwalten von Datei-Zeilen wenn sie die ersten Schritte in solchen dingen tun. Merken aber recht schnell das die Performance solcher Dateien irgendwann so absurd in den Keller geht das sie von Anfang an hätten Datenbanken nutzen sollen. Diese hier gezeigte Methode ermöglicht sogar das aufrufen der Userdaten-haltenden Datei von außen ohne das Daten nach außen dringen, noch ist irgendeiner Art von String-Spielchen nötig um überhaupt irgendetwas auszulesen.

        Kommentar


        • #5
          Danke Sirke,
          manches mal kann es so einfach sein, ich habe mindestesn 50mal über den Code drüber geschaut und schon echt an mir gezweifelt.

          @BangkokInLove
          a) 90% der Fragen aus der Ankündigung konnte ich mit ja beantworten und ich habe mich ja an die Postingregeln gehalten, außerdem würde ich mich nicht als Anfäger sehen sondern als Fortgeschrittener und so heißt dieser Bereich nun mal.

          b)Weil für dieses Project MySQL zu aufwändig wäre, da ich selber keinen zugriff auf den Online-Server habe, da es für eine Firmenwebseite ist und mir dort keine Rechte eingeräumt werden.
          Klar hätte es dieses Problem dann nicht gegeben für andere Seiten habe ich so schon umgesetzt.

          Also Thema ist fertig, Lösung hat Funktioniert

          Kommentar


          • #6
            Ein kleiner Tipp noch, benutze salted Hashes.

            Ich verstehe aber auch ne warum eine Name da drin gehasht wird, ein Hash aus Password und dynamischen salted Hash reicht voll aus.

            Warum du nun aber ein so seltsames Dateiformat nimmst und nicht bewehrte wie csv, xml, txt oder auch ne ini Datei bleibt wohl dein Rätsel, zumal du dich so unheimlich unflexibel hältst.

            Nunja ob du dich als fortgeschritten einschätzt bleibt deine private Angelegenheit, aber die Frage ist keine Fortgeschrittenen Frage. Hier kommt es im Forum auf die Frage bzw. Problemstellung an und nicht auf die persönliche Einschätzung.

            Ich habe mir mal etwas auf OOP Basis geschrieben was ich hier mal rein pinseln kann (bin nur grad auf Arbeit). Das bezieht sich nur auf eine txt. Datei, entwickel ich aber zu Hause privat grad weiter das, dass ganze dann mit mehreren Dateiformaten und der Datenauflösung da drin umgehen kann.

            Das für eine einfache Textdatei kann ich ja mal senden.

            Gruß Litter

            Kommentar


            • #7
              An deiner Lösung hätte ich auch Interesse ( Neugierde ).

              Kommentar


              • #8
                Zitat von skey-z Beitrag anzeigen
                @BangkokInLove
                a) 90% der Fragen aus der Ankündigung konnte ich mit ja beantworten und ich habe mich ja an die Postingregeln gehalten, außerdem würde ich mich nicht als Anfäger sehen sondern als Fortgeschrittener und so heißt dieser Bereich nun mal.
                Nicht erst mal selber im Manual nachzulesen, was genau eine Funktion macht, und auch nicht durch eigenes Debugging auf die Ursache eines solch simplen Fehlers zu kommen, ist nicht besonders fortgeschritten.

                *verschieb*

                Kommentar


                • #9
                  Zitat von tr0y Beitrag anzeigen
                  An deiner Lösung hätte ich auch Interesse ( Neugierde ).
                  Na klar werde ich Montag rein schreiben, denn am WE ist Familienzeit, da mache ich meinen Laptop ne an.
                  Ich habe diese Lösung im Mozilo Forum geschrieben da nenne ich mich Lit-Web falls du schon eher mal auf die Suche gehen willst.
                  Momentan arbeite ich da an einer Adapterlösung das mehrere Dateiformate als Speichermedium genutzt werden können. Ich entwickel mich auch langsam weiter, aber stehe auch immer wieder mal vor Problemen.

                  Kommentar

                  Lädt...
                  X