2016-04-05 169 views
0

我們有一個系統,用戶登錄到管理頁面進行編輯,但是當他們登錄時,只要用戶名是正確的,他們可以用任何密碼登錄。下面的代碼是在php標籤帶密碼的PHP密碼驗證

include 'database_conn.php'; 

$sql = "SELECT passwordHash FROM nmc_users WHERE username = ?"; 
$stmt = mysqli_prepare($conn, $sql); // prepare the sql statement 


mysqli_stmt_bind_param($stmt, "s", $username); 
mysqli_stmt_execute($stmt); // execute the query 



mysqli_stmt_bind_result($stmt, $passWDHash); 



if (mysqli_stmt_fetch($stmt)) { 
    if (password_verify($passWD, $passWDHash)) { 
     echo "<p>Password correct!</p><a href='logout.php'>Click here to log off</a></p>\n"; 
    } else { 

     echo "<p>Sorry we don't seem to have that username.</p>"; 
      session_destroy(); 
    } 

    if (isset($_SESSION['[url'])) 
     $url = $_SESSION['url']; 
    else 
     $url = 'index.php'; 
    header("location $url"); 

    mysqli_stmt_close($stmt); 
    mysqli_close($conn); 
} 
    ?> 

誰會知道如何使它,所以它只記錄用戶使用正確的用戶名和密碼。

密碼在我們的數據庫以及用戶名。如果需要更多的代碼,請說,我會回覆相關的部分。

+0

什麼是這裏的問題是什麼呢? – Maximus2012

+0

我的歉意我編輯了OP來包含它。 – spesh

+0

你如何生成哈希密碼? – Samsquanch

回答

0

從文檔:

session_destroy(),刪除所有與當前 會話相關聯的數據。它不會取消設置任何與會話相關的全局變量,也不會取消設置會話Cookie。

如果設置了$_SESSION['url'],並且密碼錯誤,session_destroy()將不會取消它的設置。所以你仍然陷入if語句的成功部分。

編輯:另外,您應該在需要它的實際頁面上檢查身份驗證。在這裏,它看起來像在檢查一個頁面,然後有條件地重定向到另一個頁面。如果我將其他頁面的網址直接輸入到我的地址欄中,我是否會在沒有驗證檢查的情況下獲得該網頁?

+0

要檢查確實存在這個問題,你可以在if語句之後執行'die($ url);'來查看登錄消息是否反映了腳本將重定向到的URL。但重定向不應該起作用,因爲你在'header()'函數之前回顯了一些信息。 – Samsquanch

+0

我們已經刪除了if(isset($ _ SESSION ['[url']))和後面版本的代碼中的else語句,我的錯誤。 然而它似乎並沒有被取代。我們是否應該在代碼中加入類似的東西?抱歉的混淆。 – spesh

+0

請更新問題以準確反映當前的代碼。 –

0

捎帶上@AlexHowansky答案,你需要做的幾件事情:

首先,你需要確保你使用session_start()在腳本的開頭,以確保會話設置正確。

其次,您需要取消設置$_SESSION變量以確保一旦會話被銷燬,您就無法在當前頁面上確定這些變量(它們將在下一頁中取消設置,因此您不需要不用擔心)。

第三,在重定向之前,您需要先關閉mysql連接才能做好任何事情。

四,有這個一個錯字:if (isset($_SESSION['[url']))

header()重定向也不會工作,因爲你是呼應了之前的文字,這將導致失敗,但我會告訴你解決那。

我也沒有看到$passWD來自哪裏,但我假設你在那裏有它。

更新代碼:

include 'database_conn.php'; 

session_start(); 

$sql = "SELECT passwordHash FROM nmc_users WHERE username = ?"; 
$stmt = mysqli_prepare($conn, $sql); // prepare the sql statement 


mysqli_stmt_bind_param($stmt, "s", $username); 
mysqli_stmt_execute($stmt); // execute the query 



mysqli_stmt_bind_result($stmt, $passWDHash); 



if (mysqli_stmt_fetch($stmt)) { 
    if (password_verify($passWD, $passWDHash)) { 
     echo "<p>Password correct!</p><a href='logout.php'>Click here to log off</a></p>\n"; 
    } else { 

     echo "<p>Sorry we don't seem to have that username.</p>"; 
     session_destroy(); 
     $_SESSION = array(); 
    } 

    if (isset($_SESSION['url'])) 
     $url = $_SESSION['url']; 
    else 
     $url = 'index.php'; 

    mysqli_stmt_close($stmt); 
    mysqli_close($conn); 

    header("location $url"); 

} 
    ?>