2016-10-14 64 views
0

我似乎無法得到password_verify工作W /在我的PHP PDO代碼。我的傳球領域存儲爲varchar(255)。我一直在閱讀類似的問題,但從我可以告訴我已經設置正確。我仍然要失去一些東西。 我的註冊頁面如下..什麼是使用password_verify與PDO的正確方法?

$user = $_POST['username'] 
$pass = $_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
$query = $con->prepare("INSERT INTO emps (user, pass) VALUES (?, ?)"); 
$query->execute([$user, $passH]); 

加密的密碼現已成功保存在我的數據庫。

我的登錄頁面如下..登錄頁面的

if(isset($_POST['login'])) { 
    $username = $_POST['username']; 
    $pass = trim($_POST['pass']; 
    $passH = password_hash($pass, PASSWORD_DEFAULT); 
    $sel_user = $con->prepare("SELECT id, username, pass, gid FROM emps WHERE gid!=4 AND username=?"); 
    $sel_user->execute([$username]); 
    $check_user=$sel_user->fetch(); 
    if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 
    $_SESSION['username']=$check_user['username']; 
    header("Location: xadmin.php"); 
    exit; 
    } 
    else { 
    echo "<script>alert('Not Found')</script>"; 

身體..

<form action="login.php" method="post"> 
    <table width="100%" border="0"> 
     <tbody> 
      <tr> 
       <td bgcolor="#3B3B3B" height ="35" class="BodyTxtB" align="center">Administrator Login</td></tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Username</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="text" class="BodyTxtBC" name="username" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Password</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="password" class="BodyTxtBC" name="pass" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr height="35"><td align="center"><input type="image" src="images/btn_login.jpg" name="login" value="Login"/> 
      <input type="hidden" name="login" value="Login" /></td></tr> 
      <tr height="20"><td></td></tr> 
     </tbody> 
    </table> 
    </form> 

任何人都可以發現任何錯誤?

+1

https://phpdelusions.net/pdo/password_hash –

+2

爲什麼要在驗證密碼之前先散列密碼? –

+2

您正在使用password_hash。您需要提供明文密碼和散列密碼(來自數據庫)。另外你爲什麼要修剪密碼? –

回答

1

password_verify()的參數是:(1)你想要的非散列密碼檢查和(2)哈希密碼使用的是作爲參考。比較之前你是散列的第一個參數:

$pass = trim($_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
// ... 
if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 

你應該做password_verify($pass /** the unhashed one */, $check_user['pass'])

另外,修剪密碼是一個壞主意。如果密碼實際上包含空格(你應該使用允許它執行)怎麼辦?

+0

謝謝,我確實嘗試過,但它仍然無法正常工作。現在,當我點擊提交時,登錄表單消失,但我沒有重定向到該頁面,也沒有顯示我的警報錯誤消息 – craisondigital

+0

@craisondigital檢查錯誤日誌和瀏覽器控制檯。可能的原因是您已將語法錯誤或重定向錯誤引入登錄頁面邏輯。 –

+0

謝謝@Ed Cottrell現在正在工作。 – craisondigital

2

RTM? http://php.net/password_verify

boolean password_verify (string $password , string $hash) 

您通過在PLAINTEXT密碼$password。你不要自己哈哈。這隻會產生一個帶有不同鹽分的新的散列,使得比較既無意義也不可能。

password_verify將從$hash中提取適當的鹽,使用它散列$password本身,然後比較哈希字符串。

例如password_verify基本上是這樣的:

function password_verify($pw, $hash) { 
    $salt = get_salt_from($hash); 
    $temp = password_hash($pw, $salt); 

    return ($temp == $hash); 
} 
+0

PHP是如何簡化所有事情的,很重要的是,兩個函數可以完成所有事情,這真的很有趣,但人們仍然設法使事情過於複雜。 $ temp === $ hash用於額外的度量。 –

+0

好吧,'get_salt_from()'可能會有點棘手,但否則,是的。 password_verify基本上只是一個方便。 –

+0

謝謝@MarcB向我解釋這個 – craisondigital

相關問題