2014-04-28 67 views
-1

我使用的PDO和登錄腳本不起作用?
主要原因是password_verify與實際密碼不匹配。使用PDO的登錄腳本有什麼問題?

<?php session_start(); 

include 'conn.php'; 

if(isset($_POST) && count($_POST)>0) 
{  
    $user = $_POST['user']; 
    $pass = $_POST['pass']; 
    $option=array('cost'=>12); 
    $hash=password_hash($pass,PASSWORD_BCRYPT,$option); 
    $secure = password_verify($pass,$hash); // $secure=hash('sha512',$pass); 
    $query ="SELECT * FROM signup WHERE Username=:users AND Password=:pass"; 
    $result = $conn->prepare($query); 
    $result->execute(array(':users' => $user,':pass' => $secure)); 
    $res=$result->fetchColumn(); 
    if($res>0) 
    { 
     // Set username session variable 
     $_SESSION['user'] = $user; 
     // Jump to secured page 
     header('location:index.php'); 
    }//endif 
    else 
    { 
     header('Location:signin.php'); 
    } 
} 
?> 

如果我使用hash("algo',$var)那麼腳本去罰款,但使用它是不工作的標準的PHP 5.5的技術。

回答

1

password_verify返回一個布爾值。您目前正在使用提供的$password與您剛剛生成的哈希相匹配,但沒有用。

':pass' => $secure 

應該

':pass' => $hash 

你不需要在這裏使用password_verify

+0

是的,正確的方法是爲該用戶提取哈希值,並使用password_verify比較$ password和存儲的哈希值......我不完全確定,但比較SQL中的字符串可能容易受到定時攻擊的影響,因爲大多數比較運算符在第一個不匹配的字節後返回false。 –

+0

這是一個有效的觀點,但是您還需要確保始終進行比較,即使用戶名不匹配。定時問題變得非常複雜。 – Halcyon

+0

如果我使用':pass'=> $ hash,那麼它也不適用於我。 – user3574891