我有一张如下表格:
|-------|-----------|-------------------|---------------|-----------|
| 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
是用纯文本编写的,没有加密。
等待你的建议。感谢。
答案 0 :(得分:2)
不,不是。
如果有人(某种程度上)从您的站点获取数据库转储,他们可以使用纯文本存储代码登录每个帐户。此外,你很容易受到使用这个角度攻击你的人:他们只需要测试每个电子邮件组合的数字1000-9999。也没有代码可以保护自己免受大规模登录尝试。
Jeff Atwood最近发表了关于hash security的博文。如果您担心用户密码保护,请阅读:)
如果这是一个面向公众的网站,我建议允许您的用户使用他们的Facebook,Github,Google,...帐户登录 - 以适合您的目标受众为准。这样您根本不必实现密码重置。让那些公司担心如何安全地为您做这件事......