@Drumsid

Не могу найти ошибку в коде авторизации?

Пытаюсь осваивать php. И застрял на авторизации пользователя. Функция password_verif постоянно false возвращяет и я не могу найти ошибку.
вот код на авторизацию
session_start();
header("HTTP/1.0 401 Unauthorized");
require_once 'secure.inc.php';

if ($_SERVER['REQUEST_METHOD'] == "POST") {
	$login = trim(strip_tags($_POST['login']));
	$pw = trim(strip_tags($_POST['pw']));
	$ref = trim(strip_tags($_GET['ref']));
	if (!$ref) {
		$ref = 'eshop/admin/';
	}
	if ($login and $pw) {
		if ($result = userExists($login)) {
			list($_, $hash) = explode(':', $result);
			if (checkHash($pw, $hash)) {
				$_SESSION['admin'] == true;
				header("Location: $ref");
				exit;
			} else {
				$title = 'Неправильное имя пользователя или пароль!2';
			}
		}	else {
			$title = 'Неправильное имя пользователя или пароль!1';
		}
	} else {
		$title = 'Заполните все поля формы!';
	}
}


?>
<!DOCTYPE HTML>
<html>
<head>
	<title>Авторизация</title>
	<meta charset="utf-8">
</head>
<body>
	<h1><?= $title?></h1><p>чтоб зайти в админку без пароля, надо закоментить уод в файле admin/secure/session.inc.php</p>
	<form action="<?= $_SERVER['REQUEST_URI']?>" method="post">
		<div>
			<label for="txtUser">Логин</label>
			<input id="txtUser" type="text" name="login" value="<?= $login?>" />
		</div>
		<div>
			<label for="txtString">Пароль</label>
			<input id="txtString" type="password" name="pw" />
		</div>
		<div>
			<button type="submit">Войти</button>
		</div>	
	</form>

вот функции
<?
define('FILE_NAME', '.htpasswd');

function getHash($password){
	$hash = password_hash($password, PASSWORD_DEFAULT); //, PASSWORD_BCRYPT
	return $hash;
}

function checkHash($password, $hash){
	return password_verify($password, $hash);
}

function saveUser($login, $hash) {
	$str = "$login:$hash\n";
	if (file_put_contents(FILE_NAME, $str, FILE_APPEND)) {
		return true;
	} else {
		return false;
	}
}

function userExists($login) {
	if (!is_file(FILE_NAME)) {
		return false;
	}
	$users = file(FILE_NAME);
	foreach ($users as $user) {
		if (strpos($user, $login . ':') !== false) {
			return $user;
		}
	}
	return false;
}

function logOut (){
	session_destroy();
	header('Location: secure/login.php');
	exit;
}

хэш уже перепроверял 1100 раз, всегда фолс....
кому не лень гляньте тут понятней будет, для знающего, думаю делов на 10 минут..я уже 3 день парюсь ((
речь идет об этом
function checkHash($password, $hash){
  return password_verify($password, $hash);
}
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
irishmann
@irishmann
Научись пользоваться дебаггером
$hash должен быть длиной в 60 символов.
При выборке из файла у вас еще и перенос строки добавляется, в var_dump это хорошо видно.
5d3150db24b82548882346.jpeg
Далее вы получаете $hash через list($_, $hash) = explode(':', $result);, перенос строки остается в $hash, нужно просто его убрать.
str_replace(array("\r\n", "\r", "\n"), '', $hash) или trim($hash) должно решить проблему.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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