Поэтому я даю пользователям возможность создавать учетные записи с именем пользователя и паролем. Мне удалось зашифровать пароль, когда пользователь создает новую учетную запись, используя:
$hash = password_hash($password, PASSWORD_BCRYPT);
Однако при входе в систему у меня возникают проблемы с password_verify, может кто-нибудь помочь мне с тем, что у меня есть? Я знаю, что-то вроде этого:
password_verify($password, $hash)
Но я не знаю, как это структурировать или куда добавить в коде. Заранее спасибо. Вот что у меня есть:
<?php
if (isset($_GET["username"]) && isset($_GET["password"]) ){
$username = $_GET["username"];
$password = $_GET["password"];
$result = login( $username, $password);
echo $result;
}
function makeSqlConnection()
{
$DB_HostName = "";
$DB_Name = "";
$DB_User = "";
$DB_Pass = "";
$con = mysql_connect($DB_HostName,$DB_User,$DB_Pass) or die(mysql_error());
mysql_select_db($DB_Name,$con) or die(mysql_error());
return $con;
}
function disconnectSqlConnection($con)
{
mysql_close($con);
}
function login($username, $password)
{
$con = makeSqlConnection();
$sql = "select * from login where username = '$username' and password = '$password';";
$res = mysql_query($sql,$con) or die(mysql_error());
$res1 = mysql_num_rows($res);
disconnectSqlConnection($con);
if ($res1 != 0) {
return 1;
}else{
return 0;
}// end else
}// end of Function
?>
Общая практика такова:
password
хеш из базы данных, где username
= введенное имя пользователя.Я изложу вышеописанный поток в некотором псевдокоде для вас здесь:
$query = SELECT password FROM users WHERE username = '$username'
$data = FETCH_THE_DATA($query);
if(password_verify($USER_INPUTTED_PASSWORD, $data['password'])) {
// password is correct
} else {
// password is in-correct
}
Заметки
mysql_*
функции. Библиотека устарела, так как она ненадежна и будет удалена в будущих версиях PHP.
password_verify()
, в нем четко указано, что вы сравниваете «введенный пользователем пароль» с хешированной версией, которая хранится в вашей базе данных.Так как сегодня я чувствую себя хорошо и сонный, я напишу кучу кодов.
Это пример того, как использовать PDO с подготовленным оператором. Вам нужно будет настроить его в соответствии с вашими потребностями, а также проверить, не является ли сообщение / пустым.
Я предпочитаю использовать POST-запрос для входа в систему, поэтому в этом примере будет использоваться POST-запрос.
Это мой пользовательский класс. Которые используют заполнители и привязку вместо передачи параметров в запрос напрямую. Это обеспечит некоторую защиту от атаки SQL-инъекцией.
class User{
private $dbh;
function __construct(){
$this->dbh = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD) or die('db connect error');
}
function create($username, $password){
$status = false;
try{
$stmt = "INSERT INTO login (username, password)
VALUES (?, ?)";
$qry = $this->dbh->prepare($stmt);
$qry->bindParam(1, $username);
$qry->bindParam(2, $password);
$status = $qry->execute();
}catch(PDOException $e){
$e->getMessage();
}
$qry->closeCursor();
return $status;
}
public function getPassword($username){
$status = false;
try{
$stmt = "SELECT * FROM login WHERE username = ? LIMIT 1";
$qry = $this->dbh->prepare($stmt);
$qry->bindParam(1, $username);
$qry->execute();
$status = $qry->fetch(PDO::FETCH_ASSOC);
}catch(PDOException $e){
$e->getMessage();
}
$qry->closeCursor();
return $status;
}
}
Это как создать пользователя. Обратите внимание, что я не проверяю, существует ли имя пользователя. Вы можете реализовать его самостоятельно или использовать уникальный индекс для столбца имени пользователя при условии, что в сопоставлении не учитывается регистр.
Я также увеличил стоимость со значения по умолчанию, равного 10, и я определил PASSWORD_DEFAULT, который будет использоваться, потому что я хочу, чтобы механизм PHP всегда использовал самый сильный из доступных алгоритмов (в настоящее время bcrypt).
function hashPassword($password){
$password = password_hash($password, PASSWORD_DEFAULT,array('cost' => 16));
return $password;
}
$user = new User;
$_POST['password'] = hashPassword($_POST['password']);
if(!$user->create(trim($_POST['username']),$_POST['password'])){
echo 'Failed creating user';
}else{
echo 'User created';
}
Это как проверить пароль.
$user = new User;
$getPassword = $user->getPassword(trim($_POST['username']));
if(!$getPassword){
echo 'Error fetching user';
}else{
if(!password_verify($_POST['password'], $getPassword['password'])){
echo 'Login failed';
}else{
echo 'Login successful';
}
}