2012-04-13 8 views
2

Ich versuche, die Krypta-Funktion zu verwenden ein Benutzerdetails in der Datenbank zu überprüfen:Perl crypt scheinbar nicht funktioniert

my $sql = $dbh->prepare("SELECT COUNT(id) FROM tblUsers WHERE UPPER(Username)=UPPER(?) AND Password=?"); 
    my $count; 
    $sql->execute(
     $args{login_username}, 
     crypt($args{login_password},$args{login_username}) 
     ); 

aber es gibt Zeilen 0 (mit dem Passwort auf jeden Fall richtig)

die Zeile:

$sql->execute($args{login_username},$args{login_password}); 

funktioniert perfekt.

Irgendwelche Ideen, was schief gehen könnte?

+4

Ist das Passwort 'crypt'ed in Ihrer Datenbank gespeichert? (Sieht nicht so aus.) – Mat

+0

Woher weißt du, dass es "definitiv" korrekt ist? Aus dem Perl-Programm geben Sie die verschlüsselte Zeichenfolge aus. Vergleichen Sie das manuell mit dem Datensatz in der Datenbank. –

+1

@brian: wenn er sagt, dass die alternative "execute" -Linie perfekt funktioniert, nehme ich an, dass es das Passwortfeld unverschlüsselt abgleicht. – Borodin

Antwort

2

Es sieht wie das Passwort in der Datenbank unverschlüsselt gespeichert. Um die Werte in verschlüsselter Form zu vergleichen, müssen Sie diese auch datenbankseitig verschlüsseln.

MySQL hat eine ENCRYPT Funktion, so können Sie

my $sql= $dbh->prepare(<<SQL); 
SELECT COUNT(id) 
FROM tblUsers 
WHERE UPPER(Username) = UPPER(?) 
AND ENCRYPT(Password, Username) = ? 
SQL 

$sql->execute($args{login_username}, crypt($args{login_password},$args{login_username})); 

aber die genaue Syntax ist abhängig von der verwendeten Plattform schreiben.

+0

@ Borodin-'ENCRYPT' funktioniert nicht unter Windows.Es gibt' NULL' zurück. –

Verwandte Themen