Php 数字是否已验证密码重置安全吗?

Php 数字是否已验证密码重置安全吗?,php,database,passwords,Php,Database,Passwords,我有一张如下表: |-------|-----------|-------------------|---------------|-----------| | id | name | email | password | code | |_______|___________|___________________|_______________|___________| | | |

我有一张如下表:

|-------|-----------|-------------------|---------------|-----------|
|   id  |   name    |       email       |   password    |   code    |
|_______|___________|___________________|_______________|___________|
|       |           |                   |               |           |
|   1   |   user1   |   user1@gmail.com |   PASSWORD    |   8989    |
|_______|___________|___________________|_______________|___________|
|       |           |                   |               |           |
|   2   |   user2   |   user2@gmail.com |   PASSWORD    |   7676    |
|_______|___________|___________________|_______________|___________|
如您所见,有一列
code
,我用random填充。该栏为什么存在,目的是什么? 最初,我在创建密码重置页面时遇到问题,然后我创建了一个唯一的
code
作为每个用户的验证

注册

<?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>
上面的代码我删掉了很多,我只做了重要的部分。如果有什么问题,我很抱歉。但对于原创,工作没有问题

但我为什么要问这个问题? 我需要你对这个把戏的意见,因为我不太确定
代码是安全的还是有可能被黑客入侵。因为
代码
是用纯文本编写的,没有加密

等待你的建议。谢谢。

不,不是

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

杰夫·阿特伍德(Jeff Atwood)最近在博客上写了一篇关于。如果您担心用户密码保护,请阅读:)

如果这是一个面向公众的网站,我建议允许你的用户登录他们的Facebook、Github、Google。。。客户-适合您的目标受众的客户。这样,您根本不必执行密码重置。让那些公司担心如何安全地为您做到这一点……

不,不是

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

杰夫·阿特伍德(Jeff Atwood)最近在博客上写了一篇关于。如果您担心用户密码保护,请阅读:)


如果这是一个面向公众的网站,我建议允许你的用户登录他们的Facebook、Github、Google。。。客户-适合您的目标受众的客户。这样,您根本不必执行密码重置。让那些公司担心如何安全地为您做到这一点……

四位数的代码是最简单的。使用适当的散列,该散列由用户对象的某些属性加上一个随机值(至少是sha1)生成。另外,您应该实现一种机制,使代码在一段合理的时间后过期(“行业标准”可能是24小时);以前没有。添加尝试请求新代码的计数器;如果这种情况经常发生的话,在很长一段时间内阻止用户帐户这样做。四位数代码是一种缩短的方式。使用适当的散列,该散列由用户对象的某些属性加上一个随机值(至少是sha1)生成。另外,您应该实现一种机制,使代码在一段合理的时间后过期(“行业标准”可能是24小时);以前没有。添加尝试请求新代码的计数器;如果经常发生这种情况,请在较长时间内阻止用户帐户这样做。
<?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>