数字是否经过验证密码重置是否安全?

时间:2017-06-03 22:43:37

标签: php database passwords

我有一张如下表格:

|-------|-----------|-------------------|---------------|-----------|
|   id  |   name    |       email       |   password    |   code    |
|_______|___________|___________________|_______________|___________|
|       |           |                   |               |           |
|   1   |   user1   |   user1@gmail.com |   PASSWORD    |   8989    |
|_______|___________|___________________|_______________|___________|
|       |           |                   |               |           |
|   2   |   user2   |   user2@gmail.com |   PASSWORD    |   7676    |
|_______|___________|___________________|_______________|___________|

正如您所看到的,我随机填充了一列code。列为什么存在,目的是什么? 最初,我在创建密码重置页面时遇到了问题,然后我创建了一个唯一的code作为每个用户的验证。

REGISTER

<?php
include_once 'MySQLiConnect.php';

if(isset($_POST['signup'])) {

    $username = $Connection->real_escape_string($_POST['username']);
    $email = $Connection->real_escape_string($_POST['email']);
    $password = $Connection->real_escape_string($_POST['password']);
    $code = (rand(1111,9999));
    $hashed_pwd = password_hash($password, PASSWORD_DEFAULT);

    $query = "INSERT INTO users(name,email,password,code) VALUES('$username','$email','$hashed_pwd','$code')";

        if ($Connection->query($query)) {
            echo "Success";
            }
}
$Connection->close();
?>

<html>
<body>

<form method="post">
    <input type='text' name='username'/>
    <input type='email' name='email'/>
    <input type='password' name='password'/>
    <button type='submit' name='signup'>Register</button>
</form>

</body>
</html>

输入数据并注册后,用户随机生成code。我们只是说code是8989.用户不会知道code,只有在请求重置密码后才能知道。

如果用户忘记了密码,则用户可以通过在以前通过电子邮件收到的字段字段中输入code来重置密码。

重置密码

<?php
include_once 'MySQLiConnect.php';
    $inputmail = $Connection->real_escape_string($_POST['email']);
    $inputcode = $Connection->real_escape_string($_POST['code']);
    $newcode = (rand(1111,9999));
    $newpass = $Connection->real_escape_string($_POST['password']);
    $hashed_pwd = password_hash($newpass, PASSWORD_DEFAULT);

if(isset($_POST['savepass'])) {

    $check_email = $Connection->query("SELECT * FROM users WHERE email='".$inputmail."'");
    $user_check = $check_email->fetch_array();

if ($inputcode == $user_check['code']) {
    $query = "UPDATE users SET password='".$hashed_pwd."', code='".$newcode."' WHERE email='".$inputmail."'";

        if ($Connection->query($query)) {
            echo "Password updated";
        }
    } else {
        echo "Code wrong!";
    }
}
$Connection->close();
?>

<html>
<body>

<form method="post">
    <input type='email' name='email'/>
    <input type='text' name='code'/>
    <input type='password' name='password'/>
    <button type='submit' name='savepass'> Update </button>
</form>

</body>
</html>

上面的代码我削减了很多,我只采取了重要的部分。对不起,如果可能有问题。但对于原版,工作没有问题。

但为什么要提出这个问题呢? 我需要你对这个技巧的看法,因为我不太确定code是否安全或可能被黑客攻陷。因为code是用纯文本编写的,没有加密。

等待你的建议。感谢。

1 个答案:

答案 0 :(得分:2)

不,不是。

如果有人(某种程度上)从您的站点获取数据库转储,他们可以使用纯文本存储代码登录每个帐户。此外,你很容易受到使用这个角度攻击你的人:他们只需要测试每个电子邮件组合的数字1000-9999。也没有代码可以保护自己免受大规模登录尝试。

Jeff Atwood最近发表了关于hash security的博文。如果您担心用户密码保护,请阅读:)

如果这是一个面向公众的网站,我建议允许您的用户使用他们的Facebook,Github,Google,...帐户登录 - 以适合您的目标受众为准。这样您根本不必实现密码重置。让那些公司担心如何安全地为您做这件事......