if (isset($_COOKIE['sid'])) {
session_id($_COOKIE['sid']);
session_start();
if (isset($_SESSION['ip']) and isset($_SESSION['browser'])) {
if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR'] or $_SESSION['browser'] !== $_SERVER['HTTP_USER_AGENT']) {
session_abort();
}
}
}
if (isset($_SESSION['login'])) {
echo $_SESSION['login'];
} else {
if (isset($_POST['submit'])) {
$errors = array();
$stmt = $conn->prepare('SELECT id,password FROM users WHERE login = ?');
$stmt->execute(array($_POST['login']));
$user = $stmt->fetch();
if ($user) {
if ($user['password'] == $_POST['password']) {
session_id($user['id']);
session_start();
$_SESSION['ip'] == $_SERVER['REMOTE_ADDR'];
$_SESSION['browser'] = $_SERVER['HTTP_USER_AGENT'];
$_SESSION['id'] = $user['id'];
$_SESSION['login'] = $_POST['login'];
}
} else {
$errors[] = "Пользователь не найден";
}
}
}
и как я положу в массив $_SESSION['user'] пользователя, если при его получении там есть пароль, или мне лучше создать новый массив без пароля и засунуть туда?
тут можно вытащить нужные поля, не только id,password и тд, и из них выбрать что нужно хранить и засунуть в сессию.$stmt = $conn->prepare('SELECT id,password FROM users WHERE login = ?');
А как тогда лучше проверять тот человек или нет?Никак, или попросите паспорт предъявить. То что человек ввел логин и пароль является для вас гарантией идентификации, а то что третьим лицам пароль достался под воздействием психотропных препаратов, терморектального криптоанализа или стырен с бумажки на мониторе вас волновать не должно. Вас волнует совпадение логина и пароля. Все. В сессию записали - условный вася ввел правильные данные. Все.
if ($user['password'] == $_POST['password']) {
session_id($user['id']);
session_start(); // убрать, только в начале нужно
if (isset($_COOKIE['sid'])) {
session_id($_COOKIE['sid']);
session_start();
if (isset($_SESSION['ip']) and isset($_SESSION['browser'])) {
if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR'] or $_SESSION['browser'] !== $_SERVER['HTTP_USER_AGENT']) {
session_abort();
}
}
}
if($_SESSION['user']['is_logged'] == true){...}
session_name($_COOKIE['sid'];
session_start();
а почему нельзя задать сессии name с этим ключом, а потом просто получить сессию по ключу?
об этом решении мне рассказал @DevManподозреваю что имел он в виду не сессионную куку, и соответственно некоторую настройку сервера на время жизни сессионных файлов. По мне не лучшее решение, так как требует некоторых телодвижений по настройке сервера, что не всегда возможно. Да и минусы использования устаревших сессий я уже описал.
Как я понял лучшим решением является доп. таблица, в которой будут id пользователя, hash, и дата создания этого ключа доступа, чтобы их потом удалятьдостаточно поле в таблице пользователей, дополнительная таблица нужна только если вы хотите чтобы пользователь имел возможность запоминать себя с нескольких разных устройств. Дата опциональна, так как галочка "запомнить меня" подразумевает "навсегда", в крайнем случае можно задать время жизни авторизационной куки.
а по поводу того, что я сказал выше, как думаешь?там много чего, что конкретно?
$stmt = $conn->prepare('SELECT user_id FROM access WHERE hash = ?');
$stmt->execute(array($_COOKIE['sid']));
$user_id = $stmt->fetchColumn();
$stmt = $conn->prepare('SELECT * FROM users WHERE id = ?'); здесь зачем 2 запроса? У вас в 1 можно все выбрать, не делайте лишних запросов.if (isset($_POST['submit'])) {тоже не совсем верная проверка, для этого есть $_SERVER['REQUEST_METHOD'] == 'POST', и дальше у вас без проверок используются всякие post переменные... Их вообще то надо как-то проверить...if ($user) {старайтесь так не делать, проверяйте хотя бы !empty(). <?php
require 'config/config.php';
$errors = array();
if (!empty($_COOKIE['sid']) and empty($_SESSION['logged_user'])) {
$user_id = $conn->findColumn('SELECT user_id FROM access WHERE hash = ?', array($_COOKIE['sid']));
if (!empty($user_id)) {
$user = $conn->findOne('users', 'id = ?', array($user_id));
if (!empty($user)) {
setcookie('sid', $_COOKIE['sid'], time() + 60 * 60 * 24 * 365);
$_SESSION['logged_user'] = array(
'id' => $user->id,
'login' => $user->login,
'type' => $user->type,
'hash' => $_COOKIE['sid']
);
} else {
setcookie('sid', null, -1);
}
}
}
if (empty($_SESSION['logged_user'])) {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$user = $conn->findOne('users', 'login = ?', array($_POST['login']));
if (!empty($user)) {
if ($user->password == $_POST['password']) {
$hash = bin2hex(random_bytes(20));
$conn->cudOne('INSERT INTO access (user_id,hash) VALUES (?, ?)', array($user->id, $hash));
setcookie('sid', $hash, time() + 60 * 60 * 24 * 365);
$_SESSION['logged_user'] = array(
'id' => $user->id,
'login' => $user->login,
'type' => $user->type,
'hash' => $hash
);
}
} else {
$errors[] = "Пользователь не найден";
}
}
}