2016-04-05 49 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"); 

} 
    ?>