Announcement

Collapse
No announcement yet.

Dateien sollten miteinander arbeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dateien sollten miteinander arbeiten

    Hallo,

    ich habe in php ein Formular geschrieben. Meine Vorstellung:
    Wenn man auf index.php geht, erscheint ein Anmeldefenster. Hier kann man sich entweder anmelden falls man registriert ist oder man klickt auf "Registrieren" und gelangt auf neu.php. Dort kann sich der Benutzer registrieren mit name, geburtsdatum, adresse, benutzername usw.

    Die Datei neu.php arbeitet gut, es überprüft die regulären Ausdrücke und alle Bedingungen bevor alle eingegebenen Daten in die Datenbank reingeschrieben werden.
    Mein Problem tritt auf, wenn ich auf index.php mich als registrierten user (der in neu.php erstellt worden ist) anmelden möchte.
    Da kommt die Fehlermeldung "Das Passwort ist falsch". Ich hab als option auch die Fehlermeldung, dass der user nicht existiert, aber der existiert ja in der Datenbank, also nimmt es index.php doch auf. Das Passwort kann aber auch nicht falsch sein. ich bin ratlos.

    Kann mir jemand bei der Denklücke weiterhelfen???

    bei index.php:
    PHP Code:
    <?php
             session_start
    ();
             require(
    "connect.inc.php");
    ?>
    bei neu.php:
    PHP Code:
    <?php
             session_start
    ();
             require(
    "connect.inc.php");

             function 
    check_email($email) {
      ...
    ?>
    vielleicht liegt hier der fehler????

    lg
    Zuletzt editiert von infostud; 20.01.2010, 09:40. Reason: php code eingefügt

  • #2
    Hallo,
    Originally posted by infostud View Post
    ...Da kommt die Fehlermeldung "Das Passwort ist falsch". Ich hab als option auch die Fehlermeldung, dass der user nicht existiert, aber der existiert ja in der Datenbank, also nimmt es index.php doch auf. Das Passwort kann aber auch nicht falsch sein. ich bin ratlos.
    Ich hoffe die unterschiedlichen Meldungen sind nur zu Testzwecken. Ansonsten macht man so etwas nicht. Man sollte einem potenziellen Angreifer nicht verraten, dass er schon einen gültigen Benutzernamen gefunden hat und jetzt nur noch das Passwort suchen muß.

    Originally posted by infostud View Post
    ...Kann mir jemand bei der Denklücke weiterhelfen???
    Entweder ist das Passwort tatsächlich falsch, es wurde ein anderes / kein Passwort in die DB eingetragen oder die Passwortprüfung ist fehlerhaft oder ... oder ... oder ...
    Originally posted by infostud View Post
    ...
    bei index.php:
    PHP Code:
    <?php
             session_start
    ();
             require(
    "connect.inc.php");
    ?>
    bei neu.php:
    PHP Code:
    <?php
             session_start
    ();
             require(
    "connect.inc.php");

             function 
    check_email($email) {
      ...
    ?>
    Ob das wohl die relevanten Zeilen zu dem Passwortproblem sind ... bin mir nicht ganz sicher ...

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      ich finde einfach meinen fehler nicht. vielleicht ist ein variablenname nicht korrekt geschrieben dachte ich, aber ich hab nichts finden können.
      vielleicht findet ihr meinen denkfehler und könnt mir weiterhelfen.
      hier die zwei dateien, die miteinander was machen sollten.
      also benutzername wird übertragen aber nicht das passwort. index.php kann passwort warum auch immer nicht aus der datenbank lesen???
      schaut doch bitte mal
      index.php:
      PHP Code:
      ...
      elseif 
      Passwort nicht gesetzt oder ""dann gib aus"Passwort fehlt"
      }else{
                       
      $password md5($_POST['password']);
                       
      $query = @mysql_query("SELECT user, pass FROM users WHERE user = '".$_POST['username']."'") or die('Select ist fehlgeschlagen!');
                       
      $result = @mysql_fetch_array($query) or die('<p align="center">Sorry, aber dieser Benutzername existiert nicht!<br><a href="index.php?lang=de&">Zurück</a></p>');
                       if(
      $password != $result['pass']) {
                               echo 
      '<form action="index.php?lang=de&" method="post">';
                               echo 
      '<p align="center">Sorry, aber dieses Passwort ist falsch!<br><br>';
                               echo 
      '<input type="hidden" name="username" value="'.$_POST['username'].'">';
                               echo 
      '<input type="submit" name="zurueck" value="Zurück"></p>';
                               echo 
      '</form>';
                               die;
                       }else{
                               
      $user $result['user'];
                               
      session_register('user');
                               echo 
      '<p align="center">LogIn erfolgreich! :-) <br><br> <a href="sichere_seite.php">Weiter</a></p>';
                       }
               } 
      neu.php:
      PHP Code:
      ...
       }elseif(
      $_POST['password'] != $_POST['password2']) {
                       echo 
      '<form action="neu.php" method="post">';
                       echo 
      '<p align="center">Die Passwörter stimmen nicht überein!<br><br>';
                       echo 
      '<input type="hidden" name="username" value="'.$_POST['username'].'">';
                       echo 
      '<input type="submit" name="zurueck" value="Zurück"></p>';
                       echo 
      '</form>';
               }else{

                       
      $query = @mysql_query("SELECT user FROM users WHERE user = '".$_POST['username']."'");
                       
      $result = @mysql_fetch_array($query);
                       if(
      $_POST['username'] == $result['user']) {
                               echo 
      '<p align="center">Sorry, dieser Benutzername ist leider schon vergeben!<br><br><a href="neu.php">Zurück</a></p>';
                               die;
                       }else{
                               
      $name $_POST['name'];
                               
      $vorname $_POST['vorname'];
                           
      //    $gebdat = $_POST['gebdat'];
                               
      $strasse $_POST['strasse'];
                               
      $plz $_POST['plz'];
                               
      $ort $_POST['ort'];
                               
      $email $_POST['email'];
                               
      $username $_POST['username'];
                               
      $pass md5($_POST['password']);

                           
      //    if($insert = @mysql_query("INSERT INTO USERS SET name = '$name', vorname = '$vorname', gebdat = '$gebdat', strasse = '$strasse', plz = '$plz', ort = '$ort$, email = '$email', user = '$username', pass = '$pass'")) {
                                
      if($insert = @mysql_query("INSERT INTO USERS SET name = '$name', vorname = '$vorname', strasse = '$strasse', plz = '$plz', ort = '$ort', email = '$email', user = '$username', pass = '$pass'")) {
                                       echo 
      '<p align="center">Der neue Benutzer wurde erfolgreich angelegt!<br><br><a href="index.php">Zur Anmeldung</a></p>';
                               }else{
                                       echo 
      '<p align="center">Beim Anlegen des neuen Benutzers trat leider ein Fehler auf!<br><br><a href="neu.php">Zurück</a></p>';
                               }
                       } 
      //  }
               

      EDIT: Wenn ich in beiden Dateien die Zeilen $pass = md5($_POST['password']); in $pass = $_POST['password']; abändere, kann ich mich einloggen ohne Probleme. ABER in der Datenbank wird das Passwort eben nicht verschlüsselt abgelegt. Wo ist hier der Fehler? Kann mir jemand vielleicht helfen?
      Zuletzt editiert von infostud; 21.01.2010, 09:40.

      Comment


      • #4
        hmmm, kann es vielleicht daran liegen, dass die zeile $pass = md5($_POST['password']); in beiden Dateien vorkommt, also mit md5 bearbeitet werden?

        Comment


        • #5
          Hallo,

          ich gehe mal davon aus, das dein Script nur zu Test- und Lernzwecken dient. Deshalb gehe ich auf die Fehler in Bezug auf SQL- und Code-Injection, mangels fehlender Validierung / Maskierung hier nicht ein.
          Ansonsten habe ich beim groben durchsehen keinen Fehler entdecken können. An deiner Stelle würde ich mir einfach mal die Werte von $password und $result['pass'] vor dem Vergleich ausgeben lassen, um zu sehen wo hier ggfs. Unterschiede liegen. Mit dem md5() dürfte das eigentlich nichts zu tun haben.

          Das gespeicherte Passwort ist nach dem md5 32 Zeichen lang. Hat die DB-Spalte genug Platz? Welchen Typ hat die DB-Spalte? Ist sie bspw. ein CHAR(64), dann ist es kein Wunder wenn der Vergleich fehlschlägt.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Falk Prüfer,

            danke für deine Antwort, ich habe meinen Fehler gefunden: der ist in der index.php datei. ich hatte einfach einen tippfehler, der hier nicht erscheint es klappt jetzt also mit md5().
            Deshalb gehe ich auf die Fehler in Bezug auf SQL- und Code-Injection, mangels fehlender Validierung / Maskierung hier nicht ein.
            natürlich soll der skript erstmal für mich als anfänger übersichtlich sein, würde es aber mit der zeit auf die höhere ebene setzen wollen.
            meinst du mit validierung sowas:
            PHP Code:
            ... 
             }elseif(!isset(
            $_POST['email']) || $_POST['email'] == ""){
                             echo 
            '<p align="center">Eine E-Mail brauchen wir schon ;-)<br><br><a href="neu.php">Zurück</a></p>';
                     }elseif(!isset(
            $_POST['username']) || $_POST['username'] == ""){
                             echo 
            '<p align="center">Einen Benutzernamen brauchen wir schon ;-)<br><br><a href="neu.php">Zurück</a></p>';
                     }elseif(!isset(
            $_POST['password']) || $_POST['password'] == ""){
                             echo 
            '<p align="center">Ein Passwort brauchen wir schon ;-)<br><br><a href="neu.php">Zurück</a></p>';
                
                     }elseif (!
            check_varchar($_POST['name'])) {
                             echo 
            '<form action="neu.php" method="post">';
                             echo 
            '<p align="center">Name ungültig!<br><br>';
                             echo 
            '<input type="submit" name="zurueck" value="Zurück"></p>';
                             echo 
            '</form>';

                     }elseif (!
            check_varchar($_POST['vorname'])) {
                             echo 
            '<form action="neu.php" method="post">';
                             echo 
            '<p align="center">Vorname ungültig!<br><br>';
                             echo 
            '<input type="submit" name="zurueck" value="Zurück"></p>';
                             echo 
            '</form>';
            ... 
            danke für deine hilfe

            Comment


            • #7
              Originally posted by infostud View Post
              ...meinst du mit validierung sowas:
              Hallo,

              mit Validierung meine ich die Überprüfung jeder Variable auf Gültigkeit in Bezug auf Länge, Datentyp und Inhalt. Eine Prüfung ob also z.B. das eingegebene Password nur Buchstaben, Zahlen und einen definierten Satz an Sonderzeichen enthält. Ein Nutzername darf z.B. keine Zeilenumbrüche enthalten etc.
              Wenn ich bei deinem Code momentan dies als Benutzername (inkl. der Anführungszeichen):

              ' union select 'test', md5('keins') order by '

              und das als Passwort:

              keins

              eingebe, dann bin ich "eingeloggt", egal was in deiner DB steht!
              Validierung alleine ohne Maskierung ist eben nur die halbe Miete. Alle in den SQL-String eingefügten Variablen sollten mindestens mit mysql_real_esacpe_string maskiert werden.
              Das sind Basics in Bezug auf Formularverarbeitung und Abfrageerzeugung, sollten also von Anfang an berücksichtigt werden.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                hmmm, wieder eine neue Ebene für mich diese maskierung.
                hab ich das dann richtig verstanden, dass das in meinem fall im groben so auszusehen hat:
                PHP Code:
                ...
                $pass md5($_POST['password']);
                                 
                $query = @mysql_query("SELECT user, pass FROM users WHERE user = '".$_POST['username']."'") or die('Select ist fehlgeschlagen!');
                                 
                $result = @mysql_fetch_array($query) or die('<p align="center">Sorry, aber dieser Benutzername existiert nicht!<br><a href="index.php?lang=de&">Zurück</a></p>');
                mysql_real_escape_string($user); 
                und:
                PHP Code:
                 $query = @mysql_query("SELECT user FROM users WHERE user = '".$_POST['username']."'");
                                 
                $result = @mysql_fetch_array($query);
                                 if(
                $_POST['username'] == $result['user']) {
                                         echo 
                '<p align="center">Sorry, dieser Benutzername ist leider schon vergeben!<br><br><a href="neu.php">Zurück</a></p>';
                                         die;
                                 }else{
                                         
                $name $_POST['name'];
                                         
                $vorname $_POST['vorname'];
                                     
                //    $gebdat = $_POST['gebdat'];
                                         
                $strasse $_POST['strasse'];
                                         
                $plz $_POST['plz'];
                                         
                $ort $_POST['ort'];
                                         
                $email $_POST['email'];
                                         
                $username $_POST['username'];
                                         
                $pass md5($_POST['password']);   /

                                   
                                          if(
                $insert = @mysql_query("INSERT INTO USERS SET name = '$name', vorname = '$vorname', strasse = '$strasse', plz = '$plz', ort = '$ort', email = '$email', user = '$username', pass = '$pass'")) {
                                                 echo 
                '<p align="center">Der neue Benutzer wurde erfolgreich angelegt!<br><br><a href="index.php">Zur Anmeldung</a></p>';
                                         }else{
                                                 echo 
                '<p align="center">Beim Anlegen des neuen Benutzers trat leider ein Fehler auf!<br><br><a href="neu.php">Zurück</a></p>';
                                         }
                                 } 
                an diese stelle kommt doch auch eine maskierung für alle vorhandenen variabeln???
                hab ich da richtig mitgedacht?

                Comment


                • #9
                  Originally posted by infostud View Post
                  ...hab ich das dann richtig verstanden, dass das in meinem fall im groben so auszusehen hat:
                  Nein, die Maskierung gehört dorthin wo sie gebraucht wird! Also eher so:
                  PHP Code:
                  ...
                  $query = @mysql_query(
                    
                  "SELECT user, pass FROM users WHERE user = '".
                     
                  mysql_real_escape_string($_POST['username'])."'"
                    or die(
                  'Select ist fehlgeschlagen!'); 
                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    achso, jetzt hab ichs verstanden., ich dachte zuerst ich muss ALLE variablen maskieren, dabei muss ich jene maskieren die aufgerufen werden aus der datenbank.
                    vielen dank für deine hilfe

                    Comment

                    Working...
                    X