为什么我的登录系统无法正常工作?

时间:2016-03-01 17:57:42

标签: php mysql password-hash

我创建了一个系统,允许管理员注册另一位管理员,并使用电子邮件地址和密码登录受保护区域。管理员通过以下表单注册:

<form action="adduser.php" method="POST">
            <label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" />
            <label for="password">Password: </label><input type="password" name="password" />
            <label for="name">Name: </label><input type="text" name="name"/>
            <input type="submit" value="Submit" name="submit"/>
</form> 

adduser.php看起来像这样:

<?php
    require'databaselogin.php';
    if(isset($_POST['emailaddress'],$_POST['password'],$_POST['name'])){
        $result= $pdo->prepare('INSERT INTO users (emailaddress, password, name )
                            VALUES(:emailaddress, :password, :name)');
        $hash = password_hash($_POST['password'], PASSWORD_DEFAULT);  
        unset($_POST['submit']);
        $_POST['password'] = $hash;
        $result->execute($_POST);
        header("Location:admin.php");
    }
?>

到目前为止,似乎可以使用名为users的表,然后填充数据。我想可能是使用$ hash不正确而不是表中存储的密码不是用户在密码字段中输入的内容?

当用户尝试使用此表单登录时:

<form action="login.php" method="POST" >
                <label for="emailaddress">Email Address:</label><input type="text" name="emailaddress"/>
                <label for="password">Password:</label><input type="password" name="password"/>
                <input type="submit" value="Go" name="submit"/>
            </form>

链接到这个php:

<?php
    session_start();

        require'databaselogin.php';
            $stmt = $pdo->prepare('SELECT * FROM users WHERE emailaddress = :emailaddress');
            if(isset($_POST['submit'])){
            $criteria = [
            'emailaddress' => $_POST['emailaddress'],
            ];
            $stmt->execute($criteria);

            $user = $stmt->fetch();
            var_dump($user);
            if (password_verify($_POST['password'], $user['password'])) {
                $_SESSION['loggedin'] = $user['id'];
                header("Location:admin.php");
            }
            else {
                header("Location:index.php");
            }
            }
?> 

在网站注册时输入正确的电子邮件和密码,只需在index.php上重新加载,而不是将它们带到admin.php。我真的无法理解这里的问题,因为代码看起来也很健康我猜这是任何$ hash实际保存到密码字段的问题。

如果有人可以提供帮助,我们将非常感激!

1 个答案:

答案 0 :(得分:3)

由于您没有回复评论,我提交了以下内容。

我怀疑您的密码列的长度太短。

如果是这种情况,则需要将其设置为60+。因此,更改列,清除包含哈希值的密码行,创建新哈希并重试。

关于此的手册:

  

PASSWORD_DEFAULT - 使用bcrypt算法(默认自PHP 5.5.0起)。请注意,此常量旨在随着时间的推移而变化,因为新的和更强大的算法被添加到PHP中。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在数据库列中,该列可以扩展到超过60个字符(255个字符将是一个不错的选择)。

  • 如果它太短,MySQL 将无声地失败。我以前见过很多次。

补充说明:

最好在每个标头后使用exit;,否则您的代码可能希望继续执行。

if (password_verify($_POST['password'], $user['password'])) {
    $_SESSION['loggedin'] = $user['id'];
    header("Location:admin.php");
    exit;
}
else {
    header("Location:index.php");
    exit;
}