2016-09-30 34 views
0

我沒有輕易地問這個問題,因爲我在整個晚上認真考慮了超過50個鏈接,試圖讓password_verify()工作。PHP password_verify()

1-哈希是100%正確的。
2-純文本版本是100%正確的。
3-哈希長度是事實60.
4-嘗試Password_Default和Password_Bcrypt
5-它成功地將密碼拉出數據庫。

if(password_verify($answer,$secAnswer)){ } IS ALWAYS false. 

這裏是我的代碼。

function anti_injection_login($sql, $formUse = true){ 
$sql = preg_replace("/(from|select|insert|delete|where|drop table|show tables|,|'|#|\*|--|\\\\)/i","",$sql); 
$sql = trim($sql); 
$sql = strip_tags($sql); 
if(!$formUse || !get_magic_quotes_gpc()) 
    $sql = addslashes($sql); 
return $sql; 
} 


    $email = anti_injection_login($_POST['email']); 
    $answer = anti_injection_login($_POST['answer']); 
    $queryAccount = mysqli_query($conn, "SELECT * FROM Accounts where email= '$email'"); 
    $count = mysqli_num_rows($queryAccount); 
    if($count == 1){ 
    $rows = mysqli_fetch_array($queryAccount); 
    $secAnswer = $rows['secretkey']; 

    if(password_verify($answer,$secAnswer)){ 
     echo "Successful"; 
    }else{ 
     echo "Try Again"; 
    } 
    } 

anti_injection_login只是爲了阻止人們注入它。 這不是問題。
由於無論我在哪裏放置Echo的 $ secAnswer和$ answer,它總是正確的,正如我所期望的那樣。

有什麼我失蹤的傢伙? 現在我對此非常難過。

(是的,這是整個腳本)。所以我沒有留下任何東西。 但如前所述,根據數據庫版本相同,它成功地將哈希(並且是正確的)拉出來。

而我用於散列的詞是Identical(同時嘗試大寫和小寫)。

+3

請使用準備好的語句。你不需要推出自己的衛生設施。 –

+1

'$ rows ['secretkey']'包含了什麼(提供示例)。並顯示如何生成'secretkey'哈希。如果密碼是'aliform_at_insert'類似的,''anti_injection_login''會破壞我的登錄。 – Justinas

+2

對不起''anti_injection_login()'是要求你的網站被黑客入侵。準備好的陳述是你*需要的*。 – alex

回答

1

PHP Manual給出了一個非常明顯的例子:

所有的
<?php 
// See the password_hash() example to see where this came from. 
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

if (password_verify('rasmuslerdorf', $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
?> 

首先,你的密碼哈希需要通過在password_hash()功能的用戶註冊創建。

登錄時,您將密碼從表單傳遞到password_verify()以及來自數據庫的存儲散列。

但是,您的代碼通過anti_injection_login()傳遞表單數據,該表單通過任何給定輸入來執行who-know-what。如果您直接將其傳遞到password_verify(),則不需要清理密碼。我強烈建議您使用準備好的語句從數據庫檢索散列,並將$_POST['answer']直接傳入password_verify()