2016-09-15 61 views
1

我已將password_hash PHP函數添加到我的註冊頁面,用戶可在其中創建帳戶和存儲密碼。我在註冊表格中應用了相同的password_hash代碼行。數據保存在數據庫中,但是當我嘗試登錄時,提交的密碼與存儲的密碼不匹配。我也嘗試了我在PHP手冊中讀到的password_verify函數,但沒有任何工作。在嘗試和嘗試之後,我真的不知道還有什麼要做,所以如果有人有建議,我會很感激。無法登錄。提交的密碼與存儲在數據庫中的密碼不匹配。 - PHP,Password_hash

P.S.我目前使用PHP版本5.6.25。

下面的代碼:

<?php 
// AJAX CALLS THIS LOGIN CODE TO EXECUTE 
if(isset($_POST["e"])){ 
    // CONNECT TO THE DATABASE 
    include_once("PHP_Includes/db.php"); 
    // GATHER THE POSTED DATA INTO LOCAL VARIABLES AND SANITIZE 
    $e = mysqli_real_escape_string($db, $_POST['e']); 
    $p = password_hash($_POST['p'], PASSWORD_DEFAULT,['cost' => 15]); 
    // FORM DATA ERROR HANDLING 
    if($e == "" || $p == ""){ 
     echo "login_failed"; 
     exit(); 
    } else { 
    // END FORM DATA ERROR HANDLING 
     $sql = "SELECT id, username, password FROM users WHERE email='$e' AND activated='1' LIMIT 1"; 
     $query = mysqli_query($db, $sql); 
     $row = mysqli_fetch_row($query); 
     $db_id = $row[0]; 
     $db_username = $row[1]; 
     $db_pass_str = $row[2]; 
     if($p != $db_pass_str){ 
      echo "login_failed"; 
      exit(); 
     } else { 
      // CREATE THEIR SESSIONS 
      $_SESSION['userid'] = $db_id; 
      $_SESSION['username'] = $db_username; 
      $_SESSION['password'] = $db_pass_str; 
     } 
    } 
    exit(); 
} 
?> 

login()函數:

function login(){ 
    var e = _("email").value; 
    var p = _("password").value; 
    if(e == "" || p == ""){ 
     _("status").innerHTML = "Fill out all of the form data"; 
    } else { 
     _("loginbtn").style.display = "none"; 
     _("status").innerHTML = 'please wait ...'; 
     var ajax = ajaxObj("POST", "index.php"); 
     ajax.onreadystatechange = function() { 
      if(ajaxReturn(ajax) == true) { 
       if(ajax.responseText == "login_failed"){ 
        _("status").innerHTML = "Login unsuccessful, please try again."; 
        _("loginbtn").style.display = "block"; 
       } else { 
        window.location = "user.php?u="+ajax.responseText; 
       } 
      } 
     } 
     ajax.send("e="+e+"&p="+p); 
    } 
} 
+0

哪裏是使用'password_verify()'你的企圖?這就是你需要使用的。 ''password_hash()'每次調用都會給你不同的結果。 –

回答

3

你如何password_hash()作品的理解是有點過。與使用sha1()md5()(兩者都應避免用於存儲密碼!)不同,password_hash()不會在每次調用時都返回相同的字符串,即使是相同的字符串也是如此。

例如:

var_dump(password_hash("hello_world", PASSWORD_DEFAULT)); 
var_dump(password_hash("hello_world", PASSWORD_DEFAULT)); 

將輸出

string(60) "$2y$10$Da2HG0dcvfI.3qBivR8Mpu9U5S06PBZ3415lDEh3EcDZ/fELZzHgC" 
string(60) "$2y$10$zL6745UkPEvZWS5w1Keco.IKi7ssl.PqldGxucDYHaJW3vgCc366a" 

的通知(例如,通過password_hash()返回的串的每個其稱爲時間而變化),它們是不同的,甚至當功能是叫兩次上相同的值?這意味着,你不能對$p = password_hash($_POST['p'], PASSWORD_DEFAULT,['cost' => 15]);比較存儲的密碼就像你正在做的,因爲password_hash()函數每次都返回不同的字符串 - 你需要使用的功能password_verify()驗證密碼,像下面

$p = $_POST['p']; 

if (password_verify($p, $fromDataBase)) { 
    // Valid password! 
} 

因此,而不是...

$p = password_hash($_POST['p'], PASSWORD_DEFAULT,['cost' => 15]); 

你想

$p = $_POST['p']; 

和代替。 ..

if($p != $db_pass_str){ 

你想在安全

if (!password_verify($p, $db_pass_str)) { 

和兩個注意事項:

  1. 您沒有使用準備好的語句,你真正應該!請參閱下面的鏈接mysqli_prepare()。您應該將所有的用戶輸入視爲危險的,因此爲所有接受用戶輸入的SQL查詢使用預準備語句。 (使用準備好的語句時,您不想使用mysqli_real_escape_string() - 使用其中一種或另一種,最好是準備好的語句!)

  2. 您正在會話中存儲密碼 - 這是非常不鼓勵的,因爲會話可能會被「劫持」。


Readingmaterial:

+1

首先,哇!非常感謝你的回覆。這就像我得到的最好的答覆!謝謝!我按照您的建議進行了更改,但是在進行更改後,我的頁面停止加載。服務器很好,其他頁面都很好,但是那個代碼頁面不再工作。在調查發生了什麼之後,代碼行'if(!password_verify($ p,$ db_pass_str)'就是問題所在。不知道該怎麼做。有沒有想法? – Millica

+0

啊,是的 - 這是我的錯,我犯了一個錯字當輸入答案時,它應該像'if(!password_verify($ p,$ db_pass_str)){'(在if語句後導致語法錯誤)''(有一個''丟失')'。我也會更新答案! – Qirel

+0

啊!我應該看到的!我真的很累,所以這是我的藉口。 :D順便說一句,我試過的代碼,它的工作原理!就在今天,我開始學習password_hash函數,我很感激你提請注意一些事情。我在教導自己,所以你的建議是值得讚賞的。再次感謝你的幫助!! :D:D – Millica

相關問題