PHP/mySQL登录不成功

标签 php mysql

我已经编写了一个 php 用户登录脚本,同时我已经设法使注册页面正常工作(因此排除了我的 common.php 文件的内容的问题)并在 mySQL 中检查了数据库正在填充,除了不成功之外,我似乎无法让登录本身发布任何内容。

我肯定是在数据库中输入用户名和密码。任何人都可以看到我哪里出错了,或者建议我如何去检查哪里出了问题吗?

表 jmp_users 的结构为:

jmp_userID / init(11) / auto_increment
jmp_username / varchar(30) / utf8_unicode_ci
jmp_password / varchar(40) / utf8_unicode_ci
salt / char(16) / utf8_unicode_ci

我的 login.php 页面是:

<?php 

require("common.php"); 

$submitted_username = ''; 

if(!empty($_POST)) 
{ 
    $query = " 
        SELECT 
            jmp_userID, 
            jmp_username, 
            jmp_password, 
            salt 
        FROM jmp_users 
        WHERE 
            jmp_username = :username 
    "; 
    $query_params = array( 
        ':username' => $_POST['jmp_username'] 
    ); 

    try 
    { 
        $stmt = $db->prepare($query); 
        $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    {  
        die("Failed to run query: " . $ex->getMessage()); 
    }  
    $login_ok = false; 
    $row = $stmt->fetch(); 
    if($row) 
    { 
        $check_password = hash('sha256', $_POST['jmp_password'] . $row['salt']); 
        for($round = 0; $round < 65536; $round++) 
        { 
            $check_password = hash('sha256', $check_password . $row['salt']); 
        } 

        if($check_password === $row['jmp_password']) 
        { 
            $login_ok = true; 
        } 
    } 
    if($login_ok) 
    { 
        unset($row['salt']); 
        unset($row['jmp_password']); 
        $_SESSION['user'] = $row; 
        header("Location: private.php"); 
        die("Redirecting to: private.php"); 
    } 
    else 
    { 
        print("Login Failed."); 
        $submitted_username = htmlentities($_POST['jmp_username'], ENT_QUOTES, 'UTF-8'); 
    } 
} 

?> 
<h1>Login</h1> 
<form action="login.php" method="post"> 
    Username:<br /> 
    <input type="text" name="username" value="<?php echo $submitted_username; ?>" /> 
    <br /><br /> 
Password:<br /> 
<input type="password" name="password" value="" /> 
<br /><br /> 
<input type="submit" value="Login" /> 
</form> 
<a href="register.php">Register</a>

最佳答案

因为您使用的是 SHA256(具有十六进制值,不是原始值),您需要 64 个字符来存储密码的哈希值(您只​​有 40 个)。

顺便说一句:我认为将密码重新散列 65536 次是不必要的,而且会浪费 CPU。 此外,通常所有密码都使用一个盐字符串。

关于PHP/mySQL登录不成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29734501/

相关文章:

php - Kohana auto_login 不起作用

php - 如何同时对多个表使用插入查询?

mysql - 将数据从 PostgreSQL 移动到 MySQL 数据库

php - 无法通过 str_replace 更改 JSON 数组中的值

php 将发布数据更改为变量

mysql - "sqlite_see_if_its_a_number"与 "mysql_bind_type_guessing"有什么关系?

php - Codeigniter 在日期格式的 SQL 查询中自动添加反引号 (`` )/波浪号

mysql - 如何将MySQL数据库恢复到某个时间点

php - 无法填充第二个下拉列表

php - 用于时间验证的正则表达式