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>