2014-11-09 82 views
0

我一直在嘗試寫幾天的簡單登錄。在我認爲我已經工作了之後,我意識到它會接受密碼字段中的任何輸入爲真,因此我將其廢棄並重新開始。我試圖使用php函數password_verify進行驗證,但無論我做什麼,它總是仍然返回true。有什麼我做錯了嗎?這裏是我的代碼(我知道它不安全,我只是希望它現在識別一個錯誤的密碼)密碼驗證總是返回true

if(isset($_POST['submit'])) 
{ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $hash = password_hash($password, PASSWORD_DEFAULT); 

    if(password_verify($_POST['password'], $hash)) 
    { 
     echo 0; 
    } 
    else 
    { 
     echo 1; 
    } 
} 
+0

@FerozAkbar它在[PHP核心](http://php.net/password_verify)中。 – 2014-11-09 04:37:19

+1

您正在比較的那個應該是從之前操作中註冊的db行中提取的散列密碼。 – Ghost 2014-11-09 04:41:36

+1

是你的「完整」代碼嗎?我懷疑它,因爲你把它標記爲'mysqli'。告訴我們你是如何使用它的。我有幾個使用這兩種功能的隨時可用的腳本。輸入密碼 – 2014-11-09 04:42:36

回答

0

您是$password得到一個$_POST['password'];

您是hash一個$password這是$_POST['password'];

password_verify($_POST['password'], $hash) 

您有hash比較一個$_POST['password']hash也是$_POST['password']

這就是爲什麼他們總是返回true.because $passwod,hash$_POST['password']是相同的。

+0

謝謝,我現在明白了! – 2014-11-09 04:58:50

0

您使用發佈密碼檢查帖子密碼。你應該檢查後密碼,而不是一個想要的密碼。

0

您正在爲通過POST收到的密碼分配$hash

這是怎麼password_verify工作

boolean password_verify (string $password , string $hash)

驗證給定$hash收到的密碼匹配。

因此,現在您正在檢查存儲在$hash中的密碼,並使用在POST中獲得的密碼相同。

因此總是如此。

2

它總是返回true的原因是因爲您正在驗證您剛剛創建的哈希值,它將始終得到正確驗證。

當您使用password_verify()函數$hash參數必須來自其他地方(通常是某種數據庫)。

// If this is a POST request then handle the form 
if ($_SERVER['REQUEST_METHOD'] === 'POST') { 

    // Get password from form 
    $pass = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW); 

    // Connect to a database of some kind 
    // Get a previously hashed password 
    $hash = 'A HASH FROM SOMEWHERE ELSE...'; 

    // Verify the previously hashed password 
    // against the password provided by the user 
    if (password_verify($pass, $hash)) { 
     echo 'Password is valid!'; 
    } 
}