Problem bei der Passwortabfrage (PHP/MYSQL)

  • Ich habe eine Anmeldung geschrieben und es klappt auch jede Abfrage nur die mit dem Passwort funktioniert irgendwie nicht. :confused: Ich bitte um Hilfe, da ich leider schon zu lange an dem Problem hänge. Danke! :)

    Ich habe es durch die Kommentare gut Strukturiert gehalten und man sieht mein rumprobieren bei dem Fehler. :rolleyes: Danke schonmal für jede Hilfe!

    Script:

    Einmal editiert, zuletzt von Sucki (6. Mai 2009 um 14:13)

  • Das ist mir in der Form zu unleserlich. Rück den Quellcode mal ein und gibt ihn formattiert aus -> [ php ] [ /php ]
    Dann schau ich es mir vllt. bei Gelegenheit an. :)

    Hier mal ein kleines Login-Skript, vllt. hilft dir das auch als Anregung schon weiter:

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ok, das ist schonmal lesbarer. :)

    An welcher Stelle hakt es denn genau, also ab wo ganz genau macht es nicht mehr das was du gern hättest?

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Also es ist so, wenn ich in das Feld "Passwort" eine Eingabe mache (vorrausgesetzt der "Name" ist richtig geschrieben), dann gibt er mir immer den Fehler aus, dass das Passwort falsch ist. Auch wenn ich es richtig eingebe. Und er soll da halt das Passwort aus der Datenbank (zum dazugehörigen User) nehmen und vergleichen. Und nur wenns falsch ist, die Fehlermeldung ausgeben.

    ^^ Danke für deine schnellen antworten. Ich versuch mir das schon alles selbst beizubringen, aber das klappt immer nicht so gut. xD (und nicht wundern, ich hab da noch ein paar Leichen im Quelltext gelassen, wo ich rumprobiert habe).

  • Ich hab das mal auf die relevanten Teile gekürzt und die ein oder andere Anmerkung zu Änderungen reinkommentiert, so hier sollte es eigentlich laufen:

    Wurde dir die englische oder die deutsche Fehlermeldung zum PW ausgespuckt? Bei der deutschen ist völlig klar das die kommt, da du in der zweiten Abfrage auf user nach $username sucht, die Variable wird vorher aber gar nicht belegt, also kann auch kein Datensatz gefunden werden. (Wozu eigentlich die zweite Abfrage auf user?)

    Anmerkung:
    Warum soll ich nicht SELECT * schreiben?
    http://www.php-faq.de/q-sql-select.html

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Also erstmal danke.^^

    Dann eine Verständnissfrage:

    mysql_real_escape_string bedeutet also, dass es der Variablen immer einen Wert zuweist und der dadurch nicht auf 0 stehen kann?

    zu Punkt 2.:
    Edit* schon gut. xD

    Regards Sucki

  • Also erstmal danke.^^

    Dann eine Verständnissfrage:

    mysql_real_escape_string bedeutet also, dass es der Variablen immer einen Wert zuweist und der dadurch nicht auf 0 stehen kann?

    zu Punkt 2.:
    Edit* schon gut. xD

    Regards Sucki


    mysql_real_escape_string maskiert bestimmte Zeichen in deinem String um SQL-Injection zu verhindern.
    Mal ein Beispiel für SQL-Injection:

    Zitat


    Die Abfrage, die an MySQL übermittelt wird:

    SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''


    http://de.php.net/mysql_real_escape_string

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ich komm damit irgendwie total nicht klar.
    Also 1.:
    Wenn ich die while Schleife wegnehme, dann wird bei mir das Login nicht mehr angezeigt (d.h. die komplette Form):

    PHP
    while($info = mysql_fetch_array( $check ))
              {
                $_POST['pass'] = stripslashes($_POST['pass']);
                $info['password'] = stripslashes($info['password']);
                $_POST['pass'] = md5($_POST['pass']);
              }

    2.
    So den einen Fehler behoben.... Jetzt hab ich die scheiße, dass er die Passwortabfrage wieder nicht macht -_- er gibt nix mehr aus, egal was ich für ein Passwort eingebe.

    Bzw. hab ich es momentan so:

    SinnlosS hast du vll MSN? ^^

    5 Mal editiert, zuletzt von Sucki (6. Mai 2009 um 15:43)

  • Deswegen kann man ja zb nen md5 vergleich des pwd machen


    Ja für genau das eine Beispiel wenn die Passwörter auch (md5-)verschlüsselt in der db liegen.
    Generell ist es aber sinnvoll mysql_real_escape_string zu kennen, zum Schutz vor SQL-Injection. Das kann man für alle Felder verwenden, nicht nur für verschlüsselt gespeicherte PWs.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Simple Frage:

    Ist in $info['passwort'] überhaupt das Passwort aus der Datenbank drinne?... Weil das muss es ja sein, damit der Passwortabgleich klappt.

    bzw. ist das passwort in der Datenbank nicht md5 verschlüsselt, kann es daran liegen?

    Einmal editiert, zuletzt von Sucki (6. Mai 2009 um 15:56)

  • Naja das musst du wohl am besten wissen. In deinem letzten Beispiel selectest du ein Feld `pass`, vergleichst aber im $info-Array mit $info['password']. Der Key kann dann ja nicht belegt sein.
    Wie heißt denn die Spalte mit den Passwörtern in deiner Tabelle? `password` oder `pass`?

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Wetten, dass man das hiermit findet:

    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    5. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.


    Ich tippe mal, bei hochgedrehtem error_reporting gibt es spätestens bei dem Vergleich eine Notice-Warnung.

  • Zu md5, man sollte nicht einfach "nur" md5-verschlüsseln, sondern einen geeigneten Salt verwenden.


    Ja das ist eine Möglichkeit, wobei das auch schnell "unsicher" wird wenn jemand den Salt rausfindet.
    Wenn es wirklich so sensible Daten sind, dass einem md5 nicht mehr sicher genug erscheint, würde ich eher doppelt verschlüsseln.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook