Я написал сценарии входа/выхода из журнала на моей веб-странице, и когда пользователь регистрируется в $_SESSION
переменной $_SESSION
пользовательский агент. Теперь каждый раз, когда страница загружается, я проверяю, зарегистрирован ли пользователь или нет, и если он зарегистрирован, я проверяю, изменился ли пользовательский агент или все тот же, чтобы предотвратить угон. Если он изменился, я вызываю logOut()
:
function logOut($conn)
{
$sql = "UPDATE Users SET logged='no' WHERE username='" . $_SESSION['username'] ."'";
$conn->query($sql);
// Unset all session values
$_SESSION = array();
// get session parameters
$params = session_get_cookie_params();
// Delete the actual cookie.
setcookie(session_name(), '', time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]);
// Destroy session
session_destroy();
}
Теперь проблема заключается в том, что правильный пользователь может по-прежнему перемещаться по моему сайту во время входа в систему, пока я хотел бы, чтобы он вышел из системы. В чем может быть проблема?
Чтобы проверить этот код, я вошел в систему с помощью Mozilla Firefox, и я скопировал значение cookie в Chrome и перезагрузил домашнюю страницу, и, как и ожидалось, я не могу войти в систему с Chrome, но если я перезагружу страницу в Mozilla, она все равно войдет в систему.
Лучше использовать функцию unset(), а вместо unset ($ _ SESSION ['username'])
Также я могу сказать, что у вас в коде есть уязвимость в sql-инъекции здесь
'$ sql = "UPDATE Users SET logged =' no 'WHERE username ='". $ _SESSION ['username']. "'"; '
потому что каждый может использовать curl, изменить переменное имя пользователя на 'или' 1 '=' 1 и ввести это в
вашей веб-странице и получить доступ, поэтому вы можете изменить эту строку на
$ sql = "UPDATE Users SET logged = 'no' WHERE username = '". stripslashes ($ _ SESSION ['username']). "'"; '
$_SESSION = array();
ничего не удаляет. Он только сбрасывает переменную$_SESSION
.