@mari_greys

Проблема с авторизацией,что делать?

Здраствуйте,у меня возникла проблема и я не могу её понять уже с понедельника.
Есть база данных(если будут нужны её скрины я скину),регистрация пользователя проходит нормально через новую функцию password_hash и все данные попадают в таблицу users в базе данных.Но стоит зайти в регистрацию по коду ниже то mysqli_num_rows будет всегда выводить ноль,только при добавлении к запросу
count(*) начинает,что-то двигаться,но тогда пароль всегда будет правильный.
Вопрос такой,что у меня не так в коде с логином?

Вот код signin.php
<?php
session_start();
require_once 'connect.php';
global $connect;

$login = $_POST['login'];
$password = $_POST['password'];
$heshik = password_hash($password, PASSWORD_DEFAULT);
$VerifyPass = password_verify($password, $heshik);


$check_user = mysqli_query($connect, "SELECT * FROM users WHERE login = '$login' AND password = '$password'");

echo mysqli_num_rows($check_user);

echo mysqli_error($connect);	

if (mysqli_num_rows($check_user) > 0){

	$user = mysqli_fetch_assoc($check_user); 

	$_SESSION['user'] = [
		"id" => $user['id'],
		"login" => $user['login'],
		"avatar" => $user['avatar'],
		"email" => $user['email']
	];

}else{
	echo 'hui';
}
?>

Вот код signup.php
<?php
session_start();

require_once 'connect.php';

$login = $_POST['login'];
$password = $_POST['password'];
$password_2 = $_POST['password_2'];
$email = $_POST['email'];

if ($password === $password_2){


	$path = 'http://localhost/EGCDMsite/uploads/' . time() . $_FILES['avatar']['name'];
	if (!move_uploaded_file($_FILES['avatar']['tmp_name'], $path)){
		$_SESSION['message'] = 'Ошибка при загрузке изображения';
		header('Location: http://localhost/EGCDMsite/php/EGCDMreg.php');
	}

	$password = password_hash($password, PASSWORD_DEFAULT);

	mysqli_query($connect, "INSERT INTO 'users' ('id', 'login', 'password', 'email', 'avatar') VALUES (NULL, '$login', '$password', '$email', '$path') ");

	    $_SESSION['message'] = 'Регистрация прошла успешно!';
	    header('Location: http://localhost/HelloPage.html');
}
else {
	$_SESSION['message'] = 'Пароли не совпадают!';
	header('Location: http://localhost/EGCDMsite/php/EGCDMreg.php');	
}
?>
  • Вопрос задан
  • 123 просмотра
Решения вопроса 4
@FanatPHP
$heshik = password_hash($password, PASSWORD_DEFAULT);
$VerifyPass = password_verify($password, $heshik);

Гениальный код.
Давно я таких изысков не видел.

По теме.
Ответ написан
@Arik
password_hash всегда разный возвращает хэш, чтоб проверить нужно юзать password_verify.

password_hash - юзаем только при регистрации и смене пароля
password_verify - только при авторизации

Т.е. по логину достаешь запись из БД и через password_verify сравниваешь хэш бд с указанным паролем
Ответ написан
l3ftoverz
@l3ftoverz Куратор тега PHP
Люблю Финский металкор
Ну, ты вроде как хешируешь пароль и делаешь password_verify, но делаешь это по входным данным из POST запроса, а потом стучишь в базу, создаёшь SQL-inj и ищешь не по хешу пароля, а потому, что прилетело с POST. Нужно сперва достать хеш пароля из базы по логину, потом проверить его через password_verify.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Что за бред у вас в коде?
Вы вычисляете хэш от введённого пароля и тут же проверяете пароль по этому хэшу. Естественно, что здесь пройдёт любой пароль.
Затем вы пытаетесь найти в базе пользователя с указанными логином и паролем. Но записали то вы в базу не пароль, а хэш пароля. Естественно, что в базе ничего не найдётся.

Вам надо получить из базы хэш пользователя с указанным логином и сверить указанный пароль с этим хэшем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы