Password() Funktion in MySQL
Stephan
- php
Hallo Forum,
nach längerem verzweifeltem suchen stell ich nun die Frage im Forum:
Ich möchte einen geschützten bereich in einer Webseite erstellen.
Das ist grundsätzlich mit .htaccess kein problem, aber ich möchte
für verschiedene user verschiedene Inhalte anzeigen.
Ich hab jetzt eine Table angelegt (id,name,email,login,pwd)
in der ich die user anlegen möchte:
insert into tbl_users values(1,'Stephan','xy@df.com','stephan',password('test'));
Das funktioniert auch soweit das passwort wird verschlüsselt in
der DB gespeichert. Wenn ich nun eine Abfrage starten will ob
username und pwd richtig sind klappt das nicht.
Ich habe es folgendermaßen versucht:
select name from tbl_users where login='stephan' and password=password('test');
Kommt nix zurück. Woran liegt das? Ich habe das selbe auch schon
mit der encrypt() funktion probiert ohne erfolg.
Freu mich auf eure hilfe!
Gruß
Stephan
Moin!
Ich hab jetzt eine Table angelegt (id,name,email,login,pwd)
in der ich die user anlegen möchte:insert into tbl_users values(1,'Stephan','xy@df.com','stephan',password('test'));
Wenn du vernünftig programmieren würdest, würdest du diesen Insert so machen:
INSERT INTO tbl_users (id,name,email,login,pwd) VALUES (...deine daten..., password('test'))
Grund: Wenn du im Insert die Reihenfolge, in der du die Spalten befüllen willst, angibst, weiß die Datenbank, wie sie was einzusortieren hat. Wenn aus irgendeinem Grund deine Spaltenreihenfolge sich mal ändert (und sei es nur, weil du in der Mitte eine neue Spalte hinzufügst), dann funktioniert _mein_ Insert immer noch, während _dein_ Insert die Spalten vertauscht.
Ich habe es folgendermaßen versucht:
select name from tbl_users where login='stephan' and password=password('test');
Die Spalte mit dem Passwort heißt nicht password, sondern pwd. Jedenfalls, wenn deine Angabe oben stimmt.
Kommt nix zurück. Woran liegt das? Ich habe das selbe auch schon
mit der encrypt() funktion probiert ohne erfolg.
Hast du den MySQL-Fehler abgefangen und ausgegeben? Mach das lieber mal.
Ansonsten: Die Funktion password() von MySQL sollte man nicht selbst verwenden, sie ist für interne Zwecke vorgesehen. Mach lieber deine eigene Funktion auf. MD5 ist beispielsweise eine schöne Funktion, die du mit PHP ausführen kannst und die genau dasselbe leistet, wenn nicht sogar besseres.
- Sven Rautenberg
Hallo Sven,
danke für deine Antwort!
Ich hab jetzt eine Table angelegt (id,name,email,login,pwd)
in der ich die user anlegen möchte:insert into tbl_users values(1,'Stephan','xy@df.com','stephan',password('test'));
Wenn du vernünftig programmieren würdest, würdest du diesen Insert so machen:
INSERT INTO tbl_users (id,name,email,login,pwd) VALUES (...deine daten..., password('test'))
Würde ich normalerweise auch machen. Ich hab eigentlich nur kurz
was reingeschrieben damit ihr wisst wie ich das password() anwende.
Ich habe es folgendermaßen versucht:
select name from tbl_users where login='stephan' and password=password('test');
Die Spalte mit dem Passwort heißt nicht password, sondern pwd. Jedenfalls, wenn deine Angabe oben stimmt.
Auch das ist mir klar! War eigentlich auch nur ein tippfehler.
Sorry. Mir ging es auch hier nur wieder ums prinzip der Anwendung.
Kommt nix zurück. Woran liegt das? Ich habe das selbe auch schon
mit der encrypt() funktion probiert ohne erfolg.Hast du den MySQL-Fehler abgefangen und ausgegeben? Mach das lieber mal.
Es kommt kein MySQL Fehler zurück sondern einfach nur 0 rows.
Ansonsten: Die Funktion password() von MySQL sollte man nicht selbst verwenden, sie ist für interne Zwecke vorgesehen. Mach lieber deine eigene Funktion auf. MD5 ist beispielsweise eine schöne Funktion, die du mit PHP ausführen kannst und die genau dasselbe leistet, wenn nicht sogar besseres.
Weisst du was MD5 ist? MD5 ist ein Prüfsummenberechnungsalgo!
Damit kann man von einer Datei oder von irgendeinem String
eine Prüfsumme berechnen um beispielsweise die konsistenz von
Daten zu prüfen.
Grundsätzlich kann es vorkommen dass zwei verschiedene strings
die selbe prüfsumme zurückgeben. Deswegen würde ich sowas nicht
unbedingt für passwörter benutzen... Oder sehe ich das vielleicht
aus einem falschen Blickwinkel?
Gruß
Stephan
Moin!
Würde ich normalerweise auch machen. Ich hab eigentlich nur kurz
was reingeschrieben damit ihr wisst wie ich das password() anwende.
Ja, aber Copy&Paste ist bei sowas nie verkehrt. Denn wenn sich der Fehler in irgendeinem dummen Tippfehler versteckt, den du nicht siehst - wäre doch toll, wenn der gefunden würde.
Die Spalte mit dem Passwort heißt nicht password, sondern pwd. Jedenfalls, wenn deine Angabe oben stimmt.
Auch das ist mir klar! War eigentlich auch nur ein tippfehler.
Sorry. Mir ging es auch hier nur wieder ums prinzip der Anwendung.
Das Prinzip ist korrekt angewandt.
Es kommt kein MySQL Fehler zurück sondern einfach nur 0 rows.
Das deutet darauf hin, dass du keinen gültigen Datensatz findest. :) Haha, nicht gedacht, was? ;)
Ansonsten: Die Funktion password() von MySQL sollte man nicht selbst verwenden, sie ist für interne Zwecke vorgesehen. Mach lieber deine eigene Funktion auf. MD5 ist beispielsweise eine schöne Funktion, die du mit PHP ausführen kannst und die genau dasselbe leistet, wenn nicht sogar besseres.
Weisst du was MD5 ist? MD5 ist ein Prüfsummenberechnungsalgo!
Ich weiß sehr genau, was MD5 ist. Es ist ein irreversibler Hash-Algorithmus, welcher in der Tat für die Einmalverschlüsselung von Passwörtern angewandt wird. Er setzt einen beliebig langen Eingabestring in eine 128-Bit-Zahl um (welche oftmals als 32 Zeichen lange Hexzahl ausgegeben wird) und ist damit wesentlich besser als beispielsweise crypt(), welches nur 8 Zeichen des Passwortes beachtet und von schnellen Computern in annehmbarer Zeit per Brute Force überwindbar ist.
Damit kann man von einer Datei oder von irgendeinem String
eine Prüfsumme berechnen um beispielsweise die konsistenz von
Daten zu prüfen.
Das ist eine weitere Anwendungsmöglichkeit.
Grundsätzlich kann es vorkommen dass zwei verschiedene strings
die selbe prüfsumme zurückgeben. Deswegen würde ich sowas nicht
unbedingt für passwörter benutzen... Oder sehe ich das vielleicht
aus einem falschen Blickwinkel?
Das ist bei der password()-Funktion von MySQL mit Sicherheit auch der Fall.
Nur könnte es dir bei password() vielleicht passieren, dass diese Funktion intern mal anders gestrickt wird. Beispiel: Wenn sie intern bislang crypt verwendet hätte, wäre ein Update auf MD5 nicht schlecht. Nur ist das für dich schlecht, weil du dann deine Passwortdaten nicht mehr auf die neue DB-Version übertragen kannst. Denn zum Eintragen benötigst du entweder die Klartextvariante, die mit password() bearbeitet wird, oder das Ergebnis der crypt-Passwortvariante, die mit md5 nicht kompatibel ist.
Und schon hast du ein Problem.
Deshalb: Passwörter außerhalb der Datenbank verschlüsseln und dann speichern. Bringt außerdem noch leicht mehr Sicherheit, weil das Passwort nicht im Klartext zur Datenbank geht.
- Sven Rautenberg
Würde ich normalerweise auch machen. Ich hab eigentlich nur kurz
was reingeschrieben damit ihr wisst wie ich das password() anwende.Ja, aber Copy&Paste ist bei sowas nie verkehrt. Denn wenn sich der Fehler in irgendeinem dummen Tippfehler versteckt, den du nicht siehst - wäre doch toll, wenn der gefunden würde.
Okay werd ich in Zukunft machen, weil eigentlich hast du ja recht! :-)
Es kommt kein MySQL Fehler zurück sondern einfach nur 0 rows.
Das deutet darauf hin, dass du keinen gültigen Datensatz findest. :) Haha, nicht gedacht, was? ;)
:-)
Ich weiß sehr genau, was MD5 ist. Es ist ein irreversibler Hash-Algorithmus, welcher in der Tat für die Einmalverschlüsselung von Passwörtern angewandt wird. Er setzt einen beliebig langen Eingabestring in eine 128-Bit-Zahl um (welche oftmals als 32 Zeichen lange Hexzahl ausgegeben wird) und ist damit wesentlich besser als beispielsweise crypt(), welches nur 8 Zeichen des Passwortes beachtet und von schnellen Computern in annehmbarer Zeit per Brute Force überwindbar ist.
Damit kann man von einer Datei oder von irgendeinem String
eine Prüfsumme berechnen um beispielsweise die konsistenz von
Daten zu prüfen.Das ist eine weitere Anwendungsmöglichkeit.
Grundsätzlich kann es vorkommen dass zwei verschiedene strings
die selbe prüfsumme zurückgeben. Deswegen würde ich sowas nicht
unbedingt für passwörter benutzen... Oder sehe ich das vielleicht
aus einem falschen Blickwinkel?Das ist bei der password()-Funktion von MySQL mit Sicherheit auch der Fall.
Nur könnte es dir bei password() vielleicht passieren, dass diese Funktion intern mal anders gestrickt wird. Beispiel: Wenn sie intern bislang crypt verwendet hätte, wäre ein Update auf MD5 nicht schlecht. Nur ist das für dich schlecht, weil du dann deine Passwortdaten nicht mehr auf die neue DB-Version übertragen kannst. Denn zum Eintragen benötigst du entweder die Klartextvariante, die mit password() bearbeitet wird, oder das Ergebnis der crypt-Passwortvariante, die mit md5 nicht kompatibel ist.
Und schon hast du ein Problem.
Deshalb: Passwörter außerhalb der Datenbank verschlüsseln und dann speichern. Bringt außerdem noch leicht mehr Sicherheit, weil das Passwort nicht im Klartext zur Datenbank geht.
Alles klar! Jetzt hab ich verstanden worauf du raus willst!
Ich werde es jetzt mal mit md5() versuchen!
Ich bedanke mich für deine Hilfe!!
Gruß Stephan
Hallo nochmal!
Das hat jetzt immer noch nicht geklappt!
Jetzt poste ich mal was ich genau geschrieben hab:
mysql> update tbl_scpportalusers set scppassword=md5('hallo') where scplogin='nutrishop';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> select * from tbl_scpportalusers where scplogin='nutrishop' and scppassword = md5('hallo');
Empty set (0.00 sec)
Irgendwas mach ich hier wohl grob falsch oder?
Würd mich freuen wenn Ihr mir nochmal helfen könntet!
Danke
Stephan
Moin!
mysql> update tbl_scpportalusers set scppassword=md5('hallo') where scplogin='nutrishop';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 1mysql> select * from tbl_scpportalusers where scplogin='nutrishop' and scppassword = md5('hallo');
Empty set (0.00 sec)Irgendwas mach ich hier wohl grob falsch oder?
Ja. Du solltest md5() in _PHP_ benutzen, nicht in MySQL.
Also sowas:
$sql = "UPDATE tbl.... SET password='".md5($password)."' WHERE blah";
mysql_query($sql);
Vorteil: Du kannst dir den SQL-String zu Testzwecken vorher noch mal ausgeben lassen.
Du kannst dir auch den Select-String ausgeben lassen.
Du kannst mit einem Admin-Programm (Kommandozeile oder phpMyAdmin) direkt in die Passwortspalte schauen und SELECT sowie Inhalt der Spalten vergleichen, weil du das codierte Passwort im SQL-String drin hast.
Wenn das dann nicht übereinstimmt, ist irgendwas mit md5() kaputt, oder mit der Datenbank.
- Sven Rautenberg
Halihallo Stephan
mysql> update tbl_scpportalusers set scppassword=md5('hallo') where scplogin='nutrishop';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> select * from tbl_scpportalusers where scplogin='nutrishop' and scppassword = md5('hallo');
Empty set (0.00 sec)
Irgendwas mach ich hier wohl grob falsch oder?
Überhaupt nicht. Das ist völlig korrekt. Aber wie ist scppasswort definiert? - Welcher
Datentyp? - MD5 von MySQL returnert eine 128-bit Zahl hexadezimal codiert, sprich: 32
Bytes. Ist der Datentyp alphanummerisch (CHAR(32)), fasst der Datentyp 32 Byte? -
Ansonsten werden Stellen abgeschnitten und MD5('Hello') != scppassword und daraus folgt,
dass dir ein EmptySet returniert wird.
http://www.mysql.com/doc/en/Miscellaneous_functions.html#IDX1400
Viele Grüsse
Philipp