безопасность — Как создать защиту паролем, используя php password_hash и password_verify

У меня есть некоторые проблемы с пониманием того, как использовать php 5.5.0+ password_hash и password_verify для защиты доступа к страницам.

Позвольте мне объяснить, что я сделал.
1) Когда я создаю нового пользователя для своего веб-приложения, я сохраняю имя пользователя и хешированный пароль в таблице пользователей. Для хеширования пароля, прежде чем хранить его в БД, я использую

$hashedp = password_hash($password, PASSWORD_DEFAULT);

2) На странице входа в систему я могу взять пароль, предоставленный пользователем в форме, и «сравнить» его с тем, который хранится в базе данных для того же пользователя, таким образом.

$password = the password submitted by the user
$user_hashedp = the hashed password taken from the db
if (password_verify($password, $user_hashedp)) {
// login the user
} else {
// show error
}

3) Что я не понимаю, так это как я могу проверять и защищать доступ к другим страницам после того, как пользователь вошел в систему. Представьте, что у вас есть другая страница page1.php, которую вы хотите показать, только если пользователь правильно вошел в систему.
Как я могу построить эту проверку?

С уважением,
Matt

0

Решение

Как уже сказано в комментариях, вы можете использовать сессию для этого. Ниже пример.

session_start();
if (password_verify($password, $user_hashedp)) {
// login the user
// create session for logged in user.
$_SESSION['authorized'] = true;
} else {
$_SESSION['authorized'] = false;
// show error
}

Тогда в авторизованный пользователь только .php:

session_start();
if($_SESSION['authorized'] === true) {
//content for authorized users
} else {
//content for unauthorized users
}
3

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

Я не совсем уверен, как поздно я на вечеринке, но Даан имеет правильную идею с делать сессии.

я мог бы лично установить переменную сеанса имени пользователя при успешном входе в систему, Затем на каждый страницы, убедитесь, что она установлена. Если это не так, перенаправить их на определенную страницу, например логин.

if (password_verify($password, $user_hashedp)) {
$_SESSION["user"] = $user; // user being the login username; also verified.
} else {
echo "Invalid credentials!"; // Throw some type of error. That's up to you.
}

На каждой странице вы можете включите файл, в котором будет находиться код проверки сеанса, или просто скопируйте / вставьте его на каждую страницу, как это:

if (!isset($_SESSION["user"])) // If the user has not been verified...
header("Location: login.php"); // Redirect them to a page of your choice, i.e. a login.

Вы могли бы сделать это по-другому, но самое большое преимущество, которое вы имели бы с этим, заключается в том, что если вам когда-либо понадобится получить имя пользователя для чего-то, вместо того, чтобы получить имя пользователя через запрос, которые могут повлиять на производительность, вы могли бы просто ссылаться на переменную сеанса и разобраться с этим оттуда.

Вот как бы я лично это сделал.

0

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