2012-04-13 28 views
2

我試圖使用地穴功能的數據庫來驗證用戶的詳細信息:Perl的地穴看似不工作

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

完美地工作。

任何想法可能會出錯?

+4

密碼是否存儲在你的數據庫中的crypt? (看起來不像。) – Mat 2012-04-13 06:15:16

+0

你怎麼知道它「絕對」正確?從Perl程序中輸出加密的字符串。用手比較數據庫中的記錄。 – 2012-04-13 07:01:11

+1

@brian:當他說替代的'execute'行完美工作時,我認爲它的密碼字段未加密。 – Borodin 2012-04-13 07:13:18

回答

2

它看起來像存儲在數據庫中的密碼未加密。爲了比較加密形式的值,您還需要在數據庫端加密它們。

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

,但確切的語法取決於你所使用的平臺上。

+0

@ Borodin-'ENCRYPT'在Windows上不起作用,它返回NULL。 – 2012-04-13 11:25:17