我正在编写PHP脚本,我需要登录。所以我想用用户名和密码检查数据库的输入。最好的方法是通过进行查询来比较,如果后期数据是相同的(SQL函数'like'),就像在数据库中一样?之后我计算了mysql行。如果它为零,我拒绝登录。如果是一个,我允许登录。
这是常见且正确的做法吗?还是有更好的方法?我希望拥有最好的现代方式。这也是我使用HTML5的原因。
答案 0 :(得分:0)
我的代码的一部分。为将来的cookie登录设置cookie,并在会话中设置尝试以显示验证码,如果尝试超过一定数量的登录。 (希望你能理解一下)
登录电话
if($this->check_signin_errors()) {
if($this->signin($this->user_email, sha1($this->user_pass))) { //$user_pass hashed
header("Location: /account/");
exit();
} else {
$this->generate_captcha();
}
return true;
}
登录功能
private function signin($user_email, $user_pass) {
global $con;
$query = mysqli_query($con, "SELECT *, COUNT(id) FROM `accounts` WHERE `user_email` = '".mysqli_real_escape_string($con, $user_email)."' AND `user_pass` = '".mysqli_real_escape_string($con, $user_pass)."' AND access_level >= '0'");
$result = mysqli_fetch_assoc($query);
if($result['COUNT(id)'] > 0) {
$_SESSION['account_logged'] = true;
$_SESSION['user_id'] = $result['id'];
$_SESSION['user_email'] = $result['user_email'];
$_SESSION['user_pass'] = $result['user_pass'];
$_SESSION['access_key'] = $result['access_key'];
$_SESSION['access_level'] = $result['access_level'];
$this->set_cookie('cookie_name', '1/'.$_SESSION['user_email'].'/'.$_SESSION['user_pass'], 7776000);
$_SESSION['attempt'] = 1;
return true;
}
$_SESSION['account_logged'] = false;
$_SESSION['attempt'] = $_SESSION['attempt'] + 1;
$this->throw_error(5);
return false;
}
答案 1 :(得分:0)
最新的方法是使用PHP 5.5 password hashing函数。
因为不是每个人都使用5.5,所以a library为早期的PHP版本实现了它。
因为散列密码使用动态“salt”,一个随机字符串,为每个用户单独生成,登录时实际需要读取用户数据库以获取当前散列,因为当您想要比较登录密码时,你需要哈希作为password_verify()
函数的第二个输入。
所以实际上如果你在数据库中找到用户就试试(不要在这里使用“LIKE”,这是用于搜索占位符 - 你的用户应该能够正确输入他的用户名)。如果没有找到:没有登录。如果找到两个:您应该为用户名添加唯一索引,否则您将拥有两个具有相同名称的用户。
如果找到一个条目,则读取它,比较哈希值,然后再允许它。