Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 07:28:22 von Dennis Odermann
Hi,
ich stehe vor einem kleinen Problem, da ich etwas direkt in einem Select
abfragen möchte, damit ich danach keine zusätzliche Prüfung in PHP
durchführen muss.
Ich möchte prüfen, ob ein eingegebenes Passwort in der Datenbank
vorliegt. Dazu muss ich aber noch ein in der Datenbank gespeichertes
Präfix VOR das eingegebene Passwort setzen und alles zusammen per md5
verschlüsseln (da das in der Datenbank gespeicherte Passwort auf die
gleiche Weise verschlüsselt wurde).
Meine aktuelle (leider nicht ganz funktionierende) Abfrage sieht so aus:
$sql = 'SELECT userid, password, praefix FROM users
WHERE password = "'.md5("praefix".md5($cleanvars['password'])).'" ';
In dem Bereich, in dem die md5-Verschlüsselung durchgeführt wird, sollte
"praefix" der Wert sein, der in der Datenbank steht und in dem Select
abgefragt wird. Mein Beispiel funktioniert nicht, weil "praefix" in
diesem Fall ja ein ordinärer String ist.
Gibt es eine Möglichkeit, dass mir der Wert von "praefix", der in der
Datenbank steht, an dieser Stelle zur Verfügung steht?
Vielen Dank für die Hilfe im voraus.
Gruß Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen?Geht das?
am 04.04.2007 07:38:49 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 07:57:17 von Dennis Odermann
Andreas Kretschmer schrieb:
> Das Stichwort zur Suche ist CONCAT. MySQL macht das IIRC über eine
> Funktion, andere Systeme verwenden den '||' - Operator dafür.
Danke für Deine schnelle Antwort. Mit CONCAT hatte ich es auch schon
versucht - da bekomme ich aber nur eine Fehlermeldung:
$sql = 'SELECT userid, password, praefix FROM users
WHERE password = md5(CONCAT("salt", "'.md5($cleanvars['password']).'") ';
Oder liegt das vielleicht an meinem Aufbau der Syntax zur Erzeugung des
md5-Strings?
Gruß
Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? G
am 04.04.2007 08:01:58 von Carsten Wiedmann
Dennis Odermann schrieb:
> Ich möchte prüfen, ob ein eingegebenes Passwort in der Datenbank vorliegt.
> Dazu muss ich aber noch ein in der Datenbank gespeichertes Präfix VOR das
> eingegebene Passwort setzen und alles zusammen per md5 verschlüsseln (da
> das in der Datenbank gespeicherte Passwort auf die gleiche Weise
> verschlüsselt wurde).
Also wenn ich das richtig verstehe, liegt "irgendein" String in der Spalte
`praefix`. Der Gesamtstring der sich aus diesem String + das "Passwort" was
der User eingibt ergibt, soll dann als md5-Hash das ergeben, was in der
Spalte `password` steht?
> Meine aktuelle (leider nicht ganz funktionierende) Abfrage sieht so aus:
>
> $sql = 'SELECT userid, password, praefix FROM users
> WHERE password = "'.md5("praefix".md5($cleanvars['password'])).'" ';
Da darfst hier natürlich nicht die md5 Funktion von PHP nehmen, sondern die
gleichlautende Funktion von MySQL. In etwa:
| $sql = "
| SELECT `userid`
| FROM `users`
| WHERE `password` = MD5(CONCAT(`praefix`, '{$cleanvars['password']}'))
| ";
Was in $cleanvars['password'] drin ist, sollte man natürlich noch mit
mysql_real_escape_string() behandeln, wenn noch nicht getan.
xpost&fup2 de.comp.lang.php.datenbanken
Gruß
Carsten
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? G
am 04.04.2007 08:01:58 von Carsten Wiedmann
Dennis Odermann schrieb:
> Ich möchte prüfen, ob ein eingegebenes Passwort in der Datenbank vorliegt.
> Dazu muss ich aber noch ein in der Datenbank gespeichertes Präfix VOR das
> eingegebene Passwort setzen und alles zusammen per md5 verschlüsseln (da
> das in der Datenbank gespeicherte Passwort auf die gleiche Weise
> verschlüsselt wurde).
Also wenn ich das richtig verstehe, liegt "irgendein" String in der Spalte
`praefix`. Der Gesamtstring der sich aus diesem String + das "Passwort" was
der User eingibt ergibt, soll dann als md5-Hash das ergeben, was in der
Spalte `password` steht?
> Meine aktuelle (leider nicht ganz funktionierende) Abfrage sieht so aus:
>
> $sql = 'SELECT userid, password, praefix FROM users
> WHERE password = "'.md5("praefix".md5($cleanvars['password'])).'" ';
Da darfst hier natürlich nicht die md5 Funktion von PHP nehmen, sondern die
gleichlautende Funktion von MySQL. In etwa:
| $sql = "
| SELECT `userid`
| FROM `users`
| WHERE `password` = MD5(CONCAT(`praefix`, '{$cleanvars['password']}'))
| ";
Was in $cleanvars['password'] drin ist, sollte man natürlich noch mit
mysql_real_escape_string() behandeln, wenn noch nicht getan.
xpost&fup2 de.comp.lang.php.datenbanken
Gruß
Carsten
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen?Geht das?
am 04.04.2007 08:08:33 von Andreas Kretschmer
Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 08:25:33 von Dennis Odermann
Carsten Wiedmann schrieb:
> Da darfst hier natürlich nicht die md5 Funktion von PHP nehmen, sondern
> die gleichlautende Funktion von MySQL. In etwa:
> | $sql = "
> | SELECT `userid`
> | FROM `users`
> | WHERE `password` = MD5(CONCAT(`praefix`, '{$cleanvars['password']}'))
> | ";
Danke, der Aufbau Deines Selects in Verbindung mit CONCAT funktioniert
(im Gegensatz zu meinem).
Ich bin aber anscheinend etwas zu blöd, um jetzt auch noch zusätzlich
das $cleanvars['password'] mit md5 zu verschlüsseln (was nämlich
notwendig ist). Es muss zunächst $cleanvars['password'] mit md5
verschlüsselt werden und dann das ganz noch einmal mit dem praefix davor.
Könntest Du mir da noch einmal einen Hinweis geben, wie ich das zu
schreiben habe?
> Was in $cleanvars['password'] drin ist, sollte man natürlich noch mit
> mysql_real_escape_string() behandeln, wenn noch nicht getan.
Danke für den Hinweis, aber das kommt natürlich noch.
Gruß
Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 08:26:42 von steinboeck
Dennis Odermann schrieb:
> $sql = 'SELECT userid, password, praefix FROM users
> WHERE password = md5(CONCAT("salt", "'.md5($cleanvars['password']).'") ';
Glaskugel-modus: 3 Klammern auf und zwei zu.
Michael
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 08:28:20 von Dennis Odermann
Michael Steinböck schrieb:
> Glaskugel-modus: 3 Klammern auf und zwei zu.
Ups, das ist peinlich... Danke für den Hinweis!
Gruß
Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 08:40:18 von Dennis Odermann
Super, ich danke Euch für die Hilfe! Jetzt geht es endlich :-)
Gruß
Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? G
am 04.04.2007 08:48:08 von Carsten Wiedmann
Dennis Odermann schrieb:
> > > WHERE `password` = MD5(CONCAT(`praefix`, '{$cleanvars['password']}'))
>
> Ich bin aber anscheinend etwas zu blöd, um jetzt auch noch zusätzlich das
> $cleanvars['password'] mit md5 zu verschlüsseln (was nämlich notwendig
> ist). Es muss zunächst $cleanvars['password'] mit md5 verschlüsselt werden
> und dann das ganz noch einmal mit dem praefix davor.
| WHERE `password` = MD5(CONCAT(`praefix`, MD5('{$cleanvars['password']}')))
Gruß
Carsten
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen?Geht das?
am 04.04.2007 14:29:57 von Andreas Scherbaum
Dennis Odermann wrote:
>
> Ich möchte prüfen, ob ein eingegebenes Passwort in der Datenbank
> vorliegt. Dazu muss ich aber noch ein in der Datenbank gespeichertes
> Präfix VOR das eingegebene Passwort setzen und alles zusammen per md5
> verschlüsseln (da das in der Datenbank gespeicherte Passwort auf die
> gleiche Weise verschlüsselt wurde).
Wenn ich das richtig sehe, taucht dein Klartext Passwort jetzt an
diversen Stellen in Logdateien auf: Im Binlog der Datenbank, ev. im
Querylog oder Log für langsame Queries.
Ich weiss nicht, ob das so eine gute Idee darstellt ...
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 19:56:47 von odermann
On 4 Apr., 14:29, Andreas Scherbaum wrote:
> Wenn ich das richtig sehe, taucht dein Klartext Passwort jetzt an
> diversen Stellen in Logdateien auf: Im Binlog der Datenbank, ev. im
> Querylog oder Log für langsame Queries.
>
> Ich weiss nicht, ob das so eine gute Idee darstellt ...
Könntest Du mir das bitte etwas genauer erklären? Warum taucht das
unverschlüsselte Passwort irgendwo auf und was könnte ich dagegen
unternehmen?
Das Passwort wird vom User eingegeben und nach einer Syntaxprüfung mit
MD5 verschlüsselt. Ich hätte jetzt keine Idee, wo das Passwort im
Klartext gespeichert werden sollte/könnte.
Gruß
Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 19:58:13 von odermann
On 4 Apr., 07:28, Dennis Odermann wrote:
> Hi,
>
> ich stehe vor einem kleinen Problem, da ich etwas direkt in einem Select
> abfragen möchte, damit ich danach keine zusätzliche Prüfung in PHP
> durchführen muss.
>
> Ich möchte prüfen, ob ein eingegebenes Passwort in der Datenbank
> vorliegt. Dazu muss ich aber noch ein in der Datenbank gespeichertes
> Präfix VOR das eingegebene Passwort setzen und alles zusammen per md5
> verschlüsseln (da das in der Datenbank gespeicherte Passwort auf die
> gleiche Weise verschlüsselt wurde).
>
> Meine aktuelle (leider nicht ganz funktionierende) Abfrage sieht so aus:
>
> $sql =3D 'SELECT userid, password, praefix FROM users
> WHERE password =3D "'.md5("praefix".md5($cleanvars['password'])).'" ';
>
> In dem Bereich, in dem die md5-Verschlüsselung durchgeführt wird, sol=
lte
> "praefix" der Wert sein, der in der Datenbank steht und in dem Select
> abgefragt wird. Mein Beispiel funktioniert nicht, weil "praefix" in
> diesem Fall ja ein ordinärer String ist.
>
> Gibt es eine Möglichkeit, dass mir der Wert von "praefix", der in der
> Datenbank steht, an dieser Stelle zur Verfügung steht?
>
> Vielen Dank für die Hilfe im voraus.
>
> Gruß Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen?Geht das?
am 04.04.2007 20:47:50 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 04.04.2007 21:27:10 von Joachim Durchholz
Dennis Odermann schrieb:
> Meine aktuelle (leider nicht ganz funktionierende) Abfrage sieht so aus:
>
> $sql = 'SELECT userid, password, praefix FROM users
> WHERE password = "'.md5("praefix".md5($cleanvars['password'])).'" ';
Warum suchst Du nach dem passwort und nicht nach dem Benutzernamen?
SELECT userid, password FROM users WHERE userid = '$userid'
und dann hast Du das Passwort und kannst den Präfix am Anfang rausfieseln.
> Gibt es eine Möglichkeit, dass mir der Wert von "praefix", der in der
> Datenbank steht, an dieser Stelle zur Verfügung steht?
Ja, aber sauberer (und einfacher) wär's, wenn Du dem Präfix ein eigenes
Datenbankfeld spendieren würdest.
Grüße
Jo
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen?Geht das?
am 04.04.2007 22:35:47 von Andreas Scherbaum
odermann@googlemail.com wrote:
> On 4 Apr., 14:29, Andreas Scherbaum wrote:
>> Wenn ich das richtig sehe, taucht dein Klartext Passwort jetzt an
>> diversen Stellen in Logdateien auf: Im Binlog der Datenbank, ev. im
>> Querylog oder Log für langsame Queries.
>>
>> Ich weiss nicht, ob das so eine gute Idee darstellt ...
>
> Könntest Du mir das bitte etwas genauer erklären? Warum taucht das
> unverschlüsselte Passwort irgendwo auf und was könnte ich dagegen
> unternehmen?
Ich hatte mich vertan, muss ich zugeben: du verschlüsselst das Passwort
schon auf der Clientseite und ich bin durch die ganzen " und ' beim
Lesen durcheinander gekommen.
Andernfalls wäre es nicht besonders elegant, das Klartextpasswort
irgendwo in einen Query mit einzubauen.
Mein Fehler.
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 05.04.2007 09:28:56 von Dennis Odermann
Joachim Durchholz schrieb:
>> $sql = 'SELECT userid, password, praefix FROM users
>> WHERE password = "'.md5("praefix".md5($cleanvars['password'])).'" ';
>
> Warum suchst Du nach dem passwort und nicht nach dem Benutzernamen?
Die Abfrage war nur ein verkürztes Beispiel für meine Frage - ich suche
nach dem Usernamen UND nach dem Passwort. Nur wenn beides korrekt ist,
gibt es ein gültiges Ergenis.
>> Gibt es eine Möglichkeit, dass mir der Wert von "praefix", der in der
>> Datenbank steht, an dieser Stelle zur Verfügung steht?
>
> Ja, aber sauberer (und einfacher) wär's, wenn Du dem Präfix ein eigenes
> Datenbankfeld spendieren würdest.
Der Präfix hat doch ein eigenes Datenbankfeld...
Gruß
Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 05.04.2007 09:32:38 von Dennis Odermann
Andreas Scherbaum schrieb:
> odermann@googlemail.com wrote:
>> On 4 Apr., 14:29, Andreas Scherbaum wrote:
>>> Wenn ich das richtig sehe, taucht dein Klartext Passwort jetzt an
>>> diversen Stellen in Logdateien auf: Im Binlog der Datenbank, ev. im
>>> Querylog oder Log für langsame Queries.
>>>
>>> Ich weiss nicht, ob das so eine gute Idee darstellt ...
>> Könntest Du mir das bitte etwas genauer erklären? Warum taucht das
>> unverschlüsselte Passwort irgendwo auf und was könnte ich dagegen
>> unternehmen?
>
> Ich hatte mich vertan, muss ich zugeben: du verschlüsselst das Passwort
> schon auf der Clientseite und ich bin durch die ganzen " und ' beim
> Lesen durcheinander gekommen.
>
> Andernfalls wäre es nicht besonders elegant, das Klartextpasswort
> irgendwo in einen Query mit einzubauen.
Da bin ich aber beruhigt. Ich hatte schon sehr an mir und meinen
bisherigen Kenntnissen gezweifelt.
Ich bin begeistert von dieser Newsgroup. Anstelle von einsilbigen
Antworten werden hier auch ein paar wichtige Tipps rechts und links zum
Thema gegeben. Vielen Dank.
Gruß
Dennis
Re: Teil einer mySQL-Abfrage an PHP-Variable hängen? Geht das?
am 06.04.2007 14:54:22 von Joachim Durchholz
Dennis Odermann schrieb:
> Joachim Durchholz schrieb:
>>> $sql = 'SELECT userid, password, praefix FROM users
>>> WHERE password = "'.md5("praefix".md5($cleanvars['password'])).'" ';
>>
>> Warum suchst Du nach dem passwort und nicht nach dem Benutzernamen?
>
> Die Abfrage war nur ein verkürztes Beispiel für meine Frage - ich suche
> nach dem Usernamen UND nach dem Passwort. Nur wenn beides korrekt ist,
> gibt es ein gültiges Ergenis.
Ach so.
Ich hatte das gleiche Problem und habe es so gelöst, dass ich nur nach
Benutzername gesucht habe.
Den zurückgelieferten Passworthash habe ich dann auf der PHP-Seite
ausgewertet und das nicht SQL überlassen.
Alternativ ginge natürlich sowas wie
SELECT userid, praefix, hash FROM users
WHERE userid = $userid
AND concat(praefix, md5(praefix, $passwort)) = hash
Nachteilig ist dabei, dass man das Passwort im Klartext an mysql
schickt; wenn die Datenbank auf einem anderen Rechner ist, kann ein
Lauscher das mitschneiden.
Dieser Nachteil ist irrelevant, wenn man ein Webgästebuch oder Weblog
gegen Spammer schützen will. Er ist hochrelevant, wenn Industriespionage
im Spiel sein könnte (auch Administratoren sind Bestechungsversuchen
ausgesetzt).
Grüße
Jo