mysql — проверка пароля в переполнении стека

Поэтому я даю пользователям возможность создавать учетные записи с именем пользователя и паролем. Мне удалось зашифровать пароль, когда пользователь создает новую учетную запись, используя:

$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
?>

0

Решение

Общая практика такова:

  1. получать password хеш из базы данных, где username = введенное имя пользователя.
  2. Если строки найдены, то есть пользователь
  3. Теперь вы сравниваете введенный пароль с хешем, хранящимся в базе данных.

Я изложу вышеописанный поток в некотором псевдокоде для вас здесь:

$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(), в нем четко указано, что вы сравниваете «введенный пользователем пароль» с хешированной версией, которая хранится в вашей базе данных.
1

Другие решения

Так как сегодня я чувствую себя хорошо и сонный, я напишу кучу кодов.

Это пример того, как использовать 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';
}
}
0

По вопросам рекламы [email protected]