Eric: Ich habe ein Problem, dass ich einfach nicht lösen kann! HILFE!

Hallo!
Ich habe vor einem viertel Jahr mit PHP angefangen und versuche gerade eine Highscore zu programmieren. Diese funktioniert bisher auch einwandfrei, aber ich mache noch eine Art Administratorenbereich zum Bedienen der Highscore (Erstellen,Löschen etc...).
Hier gibt's ein Problem:
Beim Einloggen sollen Name und Passwort überprüft werden und falls sie richtig sind, soll eine Session gestartet werden.
Danach soll man sofort zum Administratorenbereich gelangen.
Jedoch passiert nichts!!!
Ich kann mir das nicht erklären, da schonmal ein nahezu identisches Loginscript gemacht habe , dass super funktioniert!

Hier der Code:
    $query="SELECT * FROM User WHERE name = '".$name."' AND pw='".md5($pw)."' ";
    $count="SELECT count(*) FROM User WHERE name='".$name."' AND pw='".md5($pw)."'";
    $ergebnis2=mysql_query($query) OR die(mysql_error());
    $result=mysql_query($count) OR die(mysql_error());
while ($userdata=mysql_fetch_array($ergebnis2,MYSQL_ASSOC)) {
    if (mysql_result($result,0) == 1) {
        session_start();
    $_SESSION['name'] = $userdata['name'];
    $_SESSION['pw']   = md5($pw);
    $_SESSION['IP']   = $_SERVER['REMOTE_ADDR'];
    $_SESSION['LaLo'] = $userdata['LaLo'];
$query2="UPDATE User
        SET Lalo=Now()
        WHERE Name='".$_SESSION['name']."'";
        mysql_query($query2) OR die(mysql_error());
echo '<script language="JavaScript" type="text/javascript">
<!--
setTimeout("location.href='highscoreverwaltung.htm'",0000);
//-->
</script>';
}
else {
    echo '<div style="font-family:arial;">';
    echo '<span style="color:red;font-family:arial;">Falsches Passwort!</span><br>';
    echo '<a href="index.htm">Nochmal versuchen...</a>';
    echo '</div>';
}
 echo '---';
mysql_error();
}
 echo '----';
mysql_error();

Um zu gucken was er macht habe ich einmal noch die 3 Striche und 4 Striche gemacht.
Er zeigt nur die 4 Striche, deswegen vermute ich das er die while-Schleife uzmgangen hat...

Könnt iht mir bitte helfen?? :)

  1. Ich grüsse den Cosmos,

    Könnt iht mir bitte helfen?? :)

    Nein, da du keine Fehlermeldungen abfängst, dein error_reporting nicht auf E_ALL steht und du vermeidest, relevante Fehlermeldungen und Logdateiauszüge zu posten.

    Möge das "Self" mit euch sein

    --
    Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten
    1. Ich grüsse den Cosmos,

      Könnt iht mir bitte helfen?? :)

      Nein, da du keine Fehlermeldungen abfängst, dein error_reporting nicht auf E_ALL steht und du vermeidest, relevante Fehlermeldungen und Logdateiauszüge zu posten.

      Möge das "Self" mit euch sein

      Naja das ist ja nur ein Teil... die Verbindung zur DB und error_reporting habe ich am Anfang,...

      Und das Problem ist ja das ich keine Fehlermeldung bekomme! Ich bekommen rein garnix, außer die 4 Striche

      1. Hast Du Dir denn schon mal

        $userdata=mysql_fetch_array($ergebnis2,MYSQL_ASSOC)

        ausgeben lassen?

        Stefan

        1. Hast Du Dir denn schon mal

          $userdata=mysql_fetch_array($ergebnis2,MYSQL_ASSOC)

          ausgeben lassen?

          Stefan

          Moment....
          Hmmm. Komisch.
          Es kommen wieder nur 4 Striche, obwohl ich
           echo '----';
           echo $userdata['name'];
          geschrieben habe, aber auch keine Fehlermeldung!? o_O

          1. Moment....
            Hmmm. Komisch.
            Es kommen wieder nur 4 Striche, obwohl ich
            echo '----';
            echo $userdata['name'];
            geschrieben habe, aber auch keine Fehlermeldung!? o_O

            Dann ist in dem Array $userdata kein Schlüssel "name" definiert. Was liefert print_r($userdata)?

            1. Moment....
              Hmmm. Komisch.
              Es kommen wieder nur 4 Striche, obwohl ich
              echo '----';
              echo $userdata['name'];
              geschrieben habe, aber auch keine Fehlermeldung!? o_O

              Dann ist in dem Array $userdata kein Schlüssel "name" definiert. Was liefert print_r($userdata)?

              Eine 1. was hat das nun zu bedeuten?
              Also name mpüsste eigentlich definiert sein... Es gibt eine Table ind der die Spalte name ist und die ist auch "belegt" mit einem namen... da muss schon irgendwas schiefgelaufen sein

              1. Moment....
                Hmmm. Komisch.
                Es kommen wieder nur 4 Striche, obwohl ich
                echo '----';
                echo $userdata['name'];
                geschrieben habe, aber auch keine Fehlermeldung!? o_O

                Dann ist in dem Array $userdata kein Schlüssel "name" definiert. Was liefert print_r($userdata)?

                Eine 1. was hat das nun zu bedeuten?
                Also name mpüsste eigentlich definiert sein... Es gibt eine Table ind der die Spalte name ist und die ist auch "belegt" mit einem namen... da muss schon irgendwas schiefgelaufen sein

                [Kann man seine Beiträge nicht editieren?]
                Entschuldige, aber ich hjabe das echo vergessen wegzunehemen.
                Da kommt keine 1. Es kommt wieder nichts!

                1. [Kann man seine Beiträge nicht editieren?]
                  Entschuldige, aber ich hjabe das echo vergessen wegzunehemen.
                  Da kommt keine 1. Es kommt wieder nichts!

                  Überprüfe alle Variablen und Abfragen, die Du vor der while-Schleife benutzt. Und lass mal MYSQL_ASSOC weg. Ich bin selber noch Neuling deswegen kann ich Dir nicht genau erklären, ob das die Ursache für dein Problem sein könnte. Auf jeden Fall sind in $ergebnis2 keine Datensätze enthalten.

                  http://de.php.net/manual/en/function.mysql-fetch-array.php ist wohl auch hilfreich.

                  1. [Kann man seine Beiträge nicht editieren?]
                    Entschuldige, aber ich hjabe das echo vergessen wegzunehemen.
                    Da kommt keine 1. Es kommt wieder nichts!

                    Überprüfe alle Variablen und Abfragen, die Du vor der while-Schleife benutzt. Und lass mal MYSQL_ASSOC weg. Ich bin selber noch Neuling deswegen kann ich Dir nicht genau erklären, ob das die Ursache für dein Problem sein könnte. Auf jeden Fall sind in $ergebnis2 keine Datensätze enthalten.

                    http://de.php.net/manual/en/function.mysql-fetch-array.php ist wohl auch hilfreich.

                    Ja das mit MYSQL_ASSOC habe ich in dem anderen von mir erwähntem Loginscript auch benutzt. Kann daran nicht liegen und das funktioniert auch so und eigentlich müsste er doch 'mysql_fetch_assoc is not a valid result ressource' schreiben, wenn $ergebnis2 undefiniert wäre.

                    1. Ja das mit MYSQL_ASSOC habe ich in dem anderen von mir erwähntem Loginscript auch benutzt. Kann daran nicht liegen und das funktioniert auch so und eigentlich müsste er doch 'mysql_fetch_assoc is not a valid result ressource' schreiben, wenn $ergebnis2 undefiniert wäre.

                      Hast Du denn $ergebnis2 überprüft? Wenn Du eine Tabelle mit einer Abfrage bearbeitest, die kein Ergebnis zurückliefert (bzw. schon ein Ergebnis aber halt keine Datensätze, die auf die Abfrage passen), dann ist $ergebnis nicht undefiniert sondern vom Typ Object.

                      Beispiel:

                      $db ist eine Tabelle mit den Feldern titel und mail.

                      $ttt = $db->query("SELECT * FROM artikel WHERE titel = 'Rockenroller'") or die("HHH");

                      echo $ttt liefert Object id#2
                      echo mysqli_fetch_assoc($ttt) liefert gar nichts, weil es keinen artikel mit namen 'Rockenroller' gibt.

                      HHH kommt, wenn die Abfrage gar nicht zur Tabelle passt, ich also z.B. einen Feldnamen falsch schreibe.

                2. Setze die Ausgabe mal in die while-Schleife. Da Du direkt beim Abbruchtest eine Zuweisung machst, steht nach Abbruch der Schleife natürlich false in $userdata!
                  Wozu brauchst Du da überhaupt eine while-Schleife? Ich gehe doch mal davon aus, dass eine Benutzername/Passwort-Kombination eindeutig sein sollte.

                  Moment....
                  Hmmm. Komisch.
                  Es kommen wieder nur 4 Striche, obwohl ich
                  echo '----';
                  echo $userdata['name'];
                  geschrieben habe, aber auch keine Fehlermeldung!? o_O

                  Dann ist in dem Array $userdata kein Schlüssel "name" definiert. Was liefert print_r($userdata)?

                  Eine 1. was hat das nun zu bedeuten?
                  Also name mpüsste eigentlich definiert sein... Es gibt eine Table ind der die Spalte name ist und die ist auch "belegt" mit einem namen... da muss schon irgendwas schiefgelaufen sein

                  [Kann man seine Beiträge nicht editieren?]
                  Entschuldige, aber ich hjabe das echo vergessen wegzunehemen.
                  Da kommt keine 1. Es kommt wieder nichts!

                  1. Setze die Ausgabe mal in die while-Schleife. Da Du direkt beim Abbruchtest eine Zuweisung machst, steht nach Abbruch der Schleife natürlich false in $userdata!
                    Wozu brauchst Du da überhaupt eine while-Schleife? Ich gehe doch mal davon aus, dass eine Benutzername/Passwort-Kombination eindeutig sein sollte.

                    Die while-Schleife brauche ich, damit ich die Daten aus der mysqldatenbank in einen Array bekomme...
                    Habe ich so gelernt.

                    1. Das ist richtig, wenn Du mehrere Datensätze erwartest. Niemand hindert Dich daran, nur den ersten Datensatz aus dem Ergebnis (und es soll ja nur einen geben) zu lesen. In Kombination mit mysql_data_seek kannst Du sogar einen ganz bestimmten (z.B. den 5.) Datensatz lesen. Folgender Code müsste eigentlich genügen:

                        
                          $query="SELECT * FROM User WHERE name = '".$name."' AND pw='".md5($pw)."' ";  
                          $ergebnis2=mysql_query($query) OR die(mysql_error());  
                          /*** Wenn gültige Abfrage und Ergebnis nicht leer (User & PW korrekt) ***/  
                          if( $ergebnis2 && mysql_num_rows($ergebnis2) > 0 ) {  
                              /*** Lese ersten Datensatz ***/  
                              $userdata=mysql_fetch_array($ergebnis2,MYSQL_ASSOC);  
                              session_start();  
                              $_SESSION['name'] = $userdata['name'];  
                              $_SESSION['pw']   = md5($pw);  
                              $_SESSION['IP']   = $_SERVER['REMOTE_ADDR'];  
                              $_SESSION['LaLo'] = $userdata['LaLo'];  
                              $query2="UPDATE User  
                                 SET Lalo=Now()  
                                 WHERE Name='".$_SESSION['name']."'";  
                              mysql_query($query2) OR die(mysql_error());  
                              echo '<script language="JavaScript" type="text/javascript">  
                                 <!--  
                                 setTimeout("location.href=\'highscoreverwaltung.htm\'",0000);  
                                 //-->  
                              </script>';  
                          } else {  
                              echo '<div style="font-family:arial;">';  
                              echo '<span style="color:red;font-family:arial;">Falsches Passwort!</span><br>';  
                              echo '<a href="index.htm">Nochmal versuchen...</a>';  
                              echo '</div>';  
                          }  
                      
                      

                      Ich fürchte nur, dass das auch nichts bringt, da ja offensichtlich mit dem Namen und Passwort gar nichts gefunden wird. Prüfe, ob Deine Variablen richtig gefüllt sind, die Verbindung zur Datenbank erfolgreich war, etc. Probier das Select-Statement mal in einem MySQL-Frontend aus. Vielleicht gibts Probleme mit der Groß-/Kleinschreibung.

                      Setze die Ausgabe mal in die while-Schleife. Da Du direkt beim Abbruchtest eine Zuweisung machst, steht nach Abbruch der Schleife natürlich false in $userdata!
                      Wozu brauchst Du da überhaupt eine while-Schleife? Ich gehe doch mal davon aus, dass eine Benutzername/Passwort-Kombination eindeutig sein sollte.

                      Die while-Schleife brauche ich, damit ich die Daten aus der mysqldatenbank in einen Array bekomme...
                      Habe ich so gelernt.

                      1. Das ist richtig, wenn Du mehrere Datensätze erwartest. Niemand hindert Dich daran, nur den ersten Datensatz aus dem Ergebnis (und es soll ja nur einen geben) zu lesen. In Kombination mit mysql_data_seek kannst Du sogar einen ganz bestimmten (z.B. den 5.) Datensatz lesen. Folgender Code müsste eigentlich genügen:

                        $query="SELECT * FROM User WHERE name = '".$name."' AND pw='".md5($pw)."' ";
                            $ergebnis2=mysql_query($query) OR die(mysql_error());
                            /*** Wenn gültige Abfrage und Ergebnis nicht leer (User & PW korrekt) /
                            if( $ergebnis2 && mysql_num_rows($ergebnis2) > 0 ) {
                                /
                        Lese ersten Datensatz ***/
                                $userdata=mysql_fetch_array($ergebnis2,MYSQL_ASSOC);
                                session_start();
                                $_SESSION['name'] = $userdata['name'];
                                $_SESSION['pw']   = md5($pw);
                                $_SESSION['IP']   = $_SERVER['REMOTE_ADDR'];
                                $_SESSION['LaLo'] = $userdata['LaLo'];
                                $query2="UPDATE User
                                   SET Lalo=Now()
                                   WHERE Name='".$_SESSION['name']."'";
                                mysql_query($query2) OR die(mysql_error());
                                echo '<script language="JavaScript" type="text/javascript">
                                   <!--
                                   setTimeout("location.href='highscoreverwaltung.htm'",0000);
                                   //-->
                                </script>';
                            } else {
                                echo '<div style="font-family:arial;">';
                                echo '<span style="color:red;font-family:arial;">Falsches Passwort!</span><br>';
                                echo '<a href="index.htm">Nochmal versuchen...</a>';
                                echo '</div>';
                            }

                        
                        >   
                        > Ich fürchte nur, dass das auch nichts bringt, da ja offensichtlich mit dem Namen und Passwort gar nichts gefunden wird. Prüfe, ob Deine Variablen richtig gefüllt sind, die Verbindung zur Datenbank erfolgreich war, etc. Probier das Select-Statement mal in einem MySQL-Frontend aus. Vielleicht gibts Probleme mit der Groß-/Kleinschreibung.  
                          
                        Danke!  
                        So hat ich das jetzt auch schon ungefähr. Jetzt gibt immer es das Problem, dass dort FALSCHES PASSWORT steht. Also Name oder Pw nicht gestimmt hat! Doch ich weiß, dass ich GARANTIERT das richtige eingegeben habe. Ich habe mir mit phpmyadmin auch nochmal die Table angeschaut und steh alles ganau so drinnen, wie ich es immer eingebe.  
                        Das komische ist, dass ich jetzt auf einmal in den Adminbeereich gelange, aber er kann mir die Sessiondaten nicht ausgeben...  
                        Auch nicht die $userdata. Vorher kam ich nicht in den Adminbereich
                        
                        1. Ich grüsse den Cosmos,

                          Mal so nebenbei, lies dir mal http://www.afaik.de/usenet/faq/zitieren durch, deine Fullquotes verstossen gegen die Nutzungsbedingungen und machen deine Beiträge unübersichtlich.

                          Möge das "Self" mit euch sein

                          --
                          Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten
              2. Ich grüsse den Cosmos,

                Also name mpüsste eigentlich definiert sein...

                Wenn du, wie du anfgangs behauptet hast, das error_reporting auf E_ALL gesetzt hättest, würdest du eine Warnung bekommen, falls dieser Index nicht definiert ist.
                Also entweder hast du vorher was falsches gesagt, oder du ignorierst diese Warnung auf dem Bildschirm.

                Möge das "Self" mit euch sein

                --
                Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten
                1. Ich grüsse den Cosmos,

                  Also name mpüsste eigentlich definiert sein...

                  Wenn du, wie du anfgangs behauptet hast, das error_reporting auf E_ALL gesetzt hättest, würdest du eine Warnung bekommen, falls dieser Index nicht definiert ist.
                  Also entweder hast du vorher was falsches gesagt, oder du ignorierst diese Warnung auf dem Bildschirm.

                  Möge das "Self" mit euch sein

                  Weder noch! Es steht dort 'error_reporting(E_ALL);' und es gibt nur 4 striche, die dur ch meienn komischen test da zusatnde gekommen sind. es würd also theoretisch nur ein KOMPLETT weißer Bildschimr zu sehen sein!

                  1. Ich grüsse den Cosmos,

                    Weder noch! Es steht dort 'error_reporting(E_ALL);' und es gibt nur 4 striche, die dur ch meienn komischen test da zusatnde gekommen sind. es würd also theoretisch nur ein KOMPLETT weißer Bildschimr zu sehen sein!

                    Dann bist du doch schon nen Schtritt weiter.
                    Die Werte innerhalb des Arrays sind leerstrings. Jetzt musst du nur noch rausfinden, warum diese Strings leer sind, und das funktioniert, wenn du deren Erzeugung und Verarbeitung nachverfolgst.

                    Möge das "Self" mit euch sein

                    --
                    Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten
      2. Ich grüsse den Cosmos,

        Als erstes solltest du mal überprüfen, ob session_start() erfolgreich war, denn du fängst diesen Fehler nicht ab, genau wie einige andere.

        Möge das "Self" mit euch sein

        --
        Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten
        1. Ich grüsse den Cosmos,

          Als erstes solltest du mal überprüfen, ob session_start() erfolgreich war, denn du fängst diesen Fehler nicht ab, genau wie einige andere.

          Möge das "Self" mit euch sein

          Ach ich wusste nicht das man sowas auch abfangen muss.
          Ich versuchs mal.

          1. Ich grüsse den Cosmos,

            Als erstes solltest du mal überprüfen, ob session_start() erfolgreich war, denn du fängst diesen Fehler nicht ab, genau wie einige andere.

            Möge das "Self" mit euch sein

            Ach ich wusste nicht das man sowas auch abfangen muss.
            Ich versuchs mal.

            Tut mir Leid (Doppelpost),aber wie fange ich den fehler ab?
            Ich weiß nur wie man Mysqlfehler abfängt, denn die andern zeigt ewr doch 'automatisch' an oder irre ich mich da?

            1. Ich grüsse den Cosmos,

              Ich weiß nur wie man Mysqlfehler abfängt, denn die andern zeigt ewr doch 'automatisch' an oder irre ich mich da?

              Du irrst, da praktisch jede Funktion einen Rückgabewert hat. Im Fall von session_strart() wird dummerweise immer True zurückgegeben, also wirst du im Browser prüfen müssen, ob der Cookie gesetzt wurde.

              Möge das "Self" mit euch sein

              --
              Ich bin keine Signatur, ich fülle nur diesen leeren Platz mit sinnlosen Worten
  2. Jaaaaaaaa

    Ich hab's!!!!

    Es lag daran, dass ich in der tabelle User bei Passwort "varchar (20)" benutzt habe! Nachdem die Passwörter mit md5 verschlüsselt sind, werden sie allerdings länger als 20 Zeichen!!
    deswegen hat die Prüfung, ob die Paswörter übereinstimmen nie funktioniert. Es waren nur die ersten 20 zeichen gespeichert!

    Es hat sich alles erledigt!

  3. echo $begrüßung;

    $query="SELECT * FROM User WHERE name = '".$name."' AND pw='".md5($pw)."' ";

    Es sieht so aus, als ob dein Code eine Sicherheitslücke aufweist. Wenn du $name ohne weitere Bearbeitung aus den Eingabedaten übernimmst, kann sich jeder ohne Passwort-Kenntnis ins System begeben. Wenn jemand ' OR 1 OR ' (inklusive der ') eingibt, sieht dein Statement anders aus als von dir vorgesehen und gibt einfach alle Datensätze zurück.

    $count="SELECT count(*) FROM User WHERE name='".$name."' AND pw='".md5($pw)."'";

    Die zweite Abfrage nach der Anzahl soll vermutlich nur ermitteln, ob das Login nicht erfolgreich war. Wenn man sowohl die Ergebnismenge als auch die Anzahl der Datensätze braucht, reicht es, eine Abfrage ganz normal zu stellen und dann mit mysql_num_rows() die Anzahl der Ergebniszeilen abzufragen.

    if (mysql_result($result,0) == 1) {

    Hier entschärfst du deine Sicherheitslücke wieder - vermutlich ohne dass sie dir bewusst war - indem du den Loginvorgang nur dann fortsetzt, wenn nur ein Datensatz ermittelt wurde. Im Falle des obigen Angriffsversuches kämen mehr als einer zurück. Wenn du den Hinweisen aus dem Thread folgst und die Lösung von Karin verwendest, ist deine Sicherheitslücke wieder da, den diese Lösung unterschiedet nur zwischen 0 und mehr als 0 Datensätzen in der Ergebnismenge und fragt bei > 0 einfach nur den ersten Datensatz ab (oft ist dies der Administrator-Account).

    Wenn du auf das PHP-Feature Magic Quotes baust, werden einige kritische Zeichen entschärft, so dass der obige Angriffsversuch ins Leere geht. Magic Quotes beachtet aber nicht alle notwendigen Zeichen. Besser ist es, dieses Feature auszuschalten (was ab PHP6 sowieso der Fall sein wird) oder seine Auswirkungen rückgängig zu machen und die Entschärfung der kritischen Zeichen einer Funktion zu überlassen, die für das jeweilige Medium maßgeschneidert ist. Im Falle von MySQL ist dies mysql_real_escape_string().

    mysql_error();

    mysql_error() gibt einen String mit der Fehlermeldung zurück. Wenn du diesen ausgegeben haben möchtest, solltest du noch einen Ausgabebefehl verwenden. Außerdem brauchst du mysql_error() am Ende des Scripts nicht mehr abzufragen, da das Script im Fehlerfall bereits weiter oben gestorben ist. (Scripte sterben zu lassen und dabei eine dem Anwender nichts nützende Fehlermeldung auszugeben ist nicht gerade sehr anwenderfreundlich.)

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      $query="SELECT * FROM User WHERE name = '".$name."' AND pw='".md5($pw)."' ";

      Es sieht so aus, als ob dein Code eine Sicherheitslücke aufweist. Wenn du $name ohne weitere Bearbeitung aus den Eingabedaten übernimmst, kann sich jeder ohne Passwort-Kenntnis ins System begeben. Wenn jemand ' OR 1 OR ' (inklusive der ') eingibt, sieht dein Statement anders aus als von dir vorgesehen und gibt einfach alle Datensätze zurück.

      Das stimmt glaube ich nicht, denn ich schreibe ja das md5() davor und dann würde dort md5(' OR 1 OR ') stehen. Das würde einem bnichts bringen.

      1. echo $begrüßung;

        $query="SELECT * FROM User WHERE name = '".$name."' AND pw='".md5($pw)."' ";
        Das stimmt glaube ich nicht, denn ich schreibe ja das md5() davor und dann würde dort md5(' OR 1 OR ') stehen. Das würde einem bnichts bringen.

        Nur beim Passwort machst du das. Beim Namen aber nicht.

        echo "$verabschiedung $name";