Крипта Perl, похоже, не работает

Я пытаюсь использовать функцию crypt для проверки данных пользователя в базе данных:

    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})
        );

но он возвращает 0 строк (с паролем, безусловно, правильным)

линия:

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

работает отлично.

Есть идеи, что может пойти не так?


person skeniver    schedule 13.04.2012    source источник
comment
Пароль хранится crypted в вашей базе данных? (Не похоже.)   -  person Mat    schedule 13.04.2012
comment
Откуда вы знаете, что это определенно правильно? Из программы Perl выведите зашифрованную строку. Сравните это вручную с записью в базе данных.   -  person brian d foy    schedule 13.04.2012
comment
@brian: когда он говорит, что альтернативная строка execute работает отлично, я предполагаю, что она соответствует незашифрованному полю пароля.   -  person Borodin    schedule 13.04.2012
comment
Я стараюсь не предполагать, поэтому и спросил. Определенно в отладке обычно значит не очень. :)   -  person brian d foy    schedule 13.04.2012


Ответы (1)


Похоже, что пароль хранится в базе данных в незашифрованном виде. Чтобы сравнить значения в зашифрованном виде, вам также необходимо зашифровать их на стороне базы данных.

В MySQL есть функция ENCRYPT, поэтому вы можете написать

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}));

но точный синтаксис зависит от используемой вами платформы.

person Borodin    schedule 13.04.2012
comment
@Borodin-ENCRYPT не работает в Windows. Возвращает NULL. - person ; 13.04.2012