0

我认为我的 crypt() 有问题;php函数。我的错误日志中没有显示任何错误。

我在验证登录页面时遇到了困难。

   if( $page_mode == 'Login' )
{
require "globe.php";
    //simple post from below
    $username = htmlentities(trim($_POST['username']));
    $username = mysqli_real_escape_string($mysqli, $username);
    $password = trim($_POST['password']);
    $query = mysqli_query($mysqli, "SELECT * FROM Persons WHERE Username = '$username'");
    $row = mysqli_fetch_assoc($query);
    $numrows = mysqli_num_rows($query);
    $dbuser = $row['Username'];
    $dbpass = $row['Password'];
    $hashed_password = crypt($password, $dbpass);




    if( ($username == '') || ($password == '') ) {
        $error_string .= '<font color=red>You have left either the username or password field blank!</font>';
        }
    else if ($numrows == 0)
    {
        $error_string .= '<font color=red>No username can be found!</font>';
        }
    else if ($numrows == 1)
    {

       if ($password == $hashed_password)
       {
       $error_string .= '<font color=red>Details checked out</font>';
       }
    }
    else {
            $error_string .= '<font color=red>There was an error. Please contact an Admin</font>';

    }
}

当我输入用户名和密码进行测试时,不会显示任何错误提示。

如果有人能解决这个问题将不胜感激

应该提到该错误仅在使用 usepass 检查 dbpass 时才开始出现

4

1 回答 1

1

你有

$password = trim($_POST['password']);
$dbpass = $row['Password'];
$hashed_password = crypt($password, $dbpass);

if ($password == $hashed_password)

这会将登录表单中的明文密码与散列密码进行比较。但是您必须将散列密码与存储在数据库中的散列密码进行比较。所以,这应该是

if ($hashed_password == $dbpass)

因为在数据库中,只存储散列密码。

出于调试目的,您应该回显$hashed_password$dbpass查看这是什么错误以及如何出错。Crypt还指出,如果给定不合适的盐,该地穴可能会失败。返回的字符串将少于 13 个字符。

于 2012-11-25T18:42:51.723 回答