Skip to main content

V3.3.4 Session Termination

Requirement:

Verify that users are able to view and (having re-entered login credentials) log out of any or all currently active sessions and devices.

Explanation:#

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

Для веб-приложений рекомендуется добавлять пользовательские возможности, которые позволяют проверять сведения об активных сеансах в любое время, отслеживать и предупреждать пользователя об одновременных входах в систему, предоставлять пользовательские функции для удаленного завершения сеансов вручную и отслеживать историю активности учетной записи (журнал) путем записи несколько сведений о клиенте, таких как IP-адрес, пользовательский агент, дата и время входа в систему, время простоя и т. д.

Remediation:#

Чтобы пользователи могли просматривать текущие активные сеансы и устройства и выходить из них, можно реализовать следующее исправление:

  • Отслеживайте все активные сеансы пользователя. Эта информация может храниться в базе данных или в памяти, в зависимости от ваших требований.
  • Предоставьте пользователю страницу для просмотра всех его активных сеансов и устройств. На этой странице должна отображаться такая информация, как IP-адрес, пользовательский агент и время последней активности для каждого сеанса.
  • Чтобы выйти из сеанса или устройства, пользователю необходимо повторно ввести свои учетные данные для входа. После успешной повторной аутентификации сеанс или устройство могут быть признаны недействительными.

Вот пример реализации на PHP:

Пример функционала управления сеансами
<?php
session_start();
// Connect to database
$conn = new mysqli('hostname', 'username', 'password', 'database');
// Handle logout request
if (isset($_GET['logout'])) {
$sessionId = $_GET['logout'];
$userId = $_SESSION['userId'];
// Check if the user is re-authenticating
if (isset($_POST['reAuth'])) {
$password = $_POST['password'];
// Get the user's password hash from the database
$stmt = $conn->prepare('SELECT password FROM users WHERE id = ?');
$stmt->bind_param('i', $userId);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
// Verify the password
if (password_verify($password, $user['password'])) {
// Invalidate the session
$stmt = $conn->prepare('DELETE FROM sessions WHERE id = ?');
$stmt->bind_param('i', $sessionId);
$stmt->execute();
// Redirect to sessions page
header('Location: sessions.php');
exit;
} else {
$error = 'Incorrect password';
}
}
// Show re-authentication form
include 'reauth.php';
exit;
}
// Get the user's active sessions from the database
$stmt = $conn->prepare('SELECT id, user_agent, ip_address, last_activity FROM sessions WHERE user_id = ?');
$stmt->bind_param('i', $_SESSION['userId']);
$stmt->execute();
$result = $stmt->get_result();
$sessions = $result->fetch_all(MYSQLI_ASSOC);
// Show the sessions page
include 'sessions.php';
?>

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

Additional:#

https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html

https://code.tutsplus.com/tutorials/how-to-use-sessions-and-session-variables-in-php--cms-31839