Как убить / все php сессии? - PullRequest
23 голосов
/ 04 марта 2011

У меня есть очень простой скрипт входа в сессию php. Я хочу принудительно выйти из системы определенного пользователя или принудительно выйти из системы всех пользователей.

Как я могу прочитать все сеансы, сделанные на моем сайте, и уничтожить некоторые или все сеансы?

Ответы [ 8 ]

14 голосов
/ 04 марта 2011

Вы можете попытаться заставить PHP удалить все сеансы, выполнив

ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);

Это заставит PHP обрабатывать все сеансы как имеющие время жизни 0 секунд и 100% -ную вероятность очистки.

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

Для одного конкретного пользователя выВам нужно добавить некоторый код в ваш обработчик сеанса:

 if ($_SESSION['username'] == 'user to delete') {
     session_destroy();
 }

Сборщик мусора в PHP не контролируется, поэтому вы не можете задать ему такие параметры, как «удалить все сеансы, кроме пользователя X».Он строго просматривает метки времени последнего изменения / последнего доступа к файлам сеанса и сравнивает их с параметром max_lifetime.На самом деле он не обрабатывает данные сеанса.

6 голосов
/ 31 августа 2012

Обновлено - август 2012

Этот код основан на официальном PHP-сайте и другом хорошо написанном фрагменте на SO .

<?php
// Finds all server sessions
session_start();
// Stores in Array
$_SESSION = array();
// Swipe via memory
if (ini_get("session.use_cookies")) {
    // Prepare and swipe cookies
    $params = session_get_cookie_params();
    // clear cookies and sessions
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}
// Just in case.. swipe these values too
ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
// Completely destroy our server sessions..
session_destroy();
?>

Работает хорошо.Такие серверы, как NGinx, можно отключить, очистить кэш, выполнить сброс памяти, очистить журналы и т. Д. И вообще удалить временное использование.Даже сбросьте пределы памяти.

5 голосов
/ 04 марта 2011

Вы можете использовать session_save_path(), чтобы найти путь, в котором PHP сохраняет файлы сеанса, а затем удалить их, используя unlink().

3 голосов
/ 04 марта 2011

Это зависит от вашего хранилища сеансов.

Если вы используете хранилище сеансов PHP, то они могут находиться во временном каталоге вашего сервера.Удаление выбранных файлов «убьет» сеанс.Однако, если ваш сервер находится в рабочем состоянии, этот файл сеанса может быть занят процессом HTTP, и вы не сможете его удалить.Просто посмотрите на изображение ниже.Все файлы с именами, начинающимися с "+ ~".Screenshot of Session Occupied by Process and could not delete it

Более удачным решением является использование хранилища сеансов базы данных и удаление оттуда выбранных сеансов.Вы можете проверить HTTP_Session2 с несколькими контейнерами .

2 голосов
/ 12 марта 2017

Я нашел этот код очень полезным, и он действительно работал для меня

<?php

$path = session_save_path();

$files = glob($path.'/*'); // get all file names
foreach($files as $file){ // iterate files
  if(is_file($file))
    unlink($file); // delete file
}

?>
2 голосов
/ 05 марта 2017

Очистка всех сессий за один раз потребует сначала знать, какой session.save_handler используется для хранения сессий и определения местоположения session.save_path для удаления все сеансы. Для удаления только текущего сеанса см. документацию для session_destroy().

Вот несколько распространенных примеров удаления всех сеансов с использованием стандартного обработчика сохраненных файлов и memcached:

Использование обработчика сохранения файла

foreach(glob(ini_get("session.save_path") . "/*") as $sessionFile) {
    unlink($sessionFile);
}

Использование обработчика сохранения memcached

$memcached = new Memcached;
$memcached->addServers($listOfYourMemcachedSesssionServers);

// Memcached session keys are prefixed with "memc.sess.key." by default
$sessionKeys = preg_grep("@^memc\.sess\.key\.@", $memcached->getAllKeys());
$memcached->deleteMulti($sessionKeys);

Конечно, вы можете подумать о том, чтобы делать это только вне полосы из ваших обычных запросов HTTP-клиентов, поскольку очистка большого хранилища сеансов может занять некоторое время и иметь непреднамеренные побочные эффекты в обычном жизненном цикле запросов.

2 голосов
/ 21 августа 2014

Я создам txt файл, содержащий токен, который имеет то же значение, что и сгенерированный сеанс входа в систему, для сравнения каждый раз, когда пользователь входит в систему:

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $token = sha1(uniqid(mt_rand(), true));
    if($everything_is_valid) {
        // Set login session
        $_SESSION[$_POST['username']] = $token;
        // Create token file
        file_put_contents('log/token.' . $_POST['username'] . '.txt', $token);
        // Just to be safe
        chmod('log/token.' . $_POST['username'] . '.txt', 0600);
    }
}

Проверяет вошедших в систему пользователей:

if(isset($_SESSION['charlie']) && file_exists('log/token.charlie.txt') && $_SESSION['charlie'] == file_get_contents('log/token.charlie.txt')) {
    echo 'You are logged in.';
}

Итак, если вы хотите заставить этого пользователя charlie выйти из системы, просто удалите файл токена:

// Force logout the `charlie` user
unlink('log/token.charlie.txt');
0 голосов
/ 21 января 2015

Ответ Тауфика - лучшее, что я смог найти.
Тем не менее, вы можете дополнительно изменить его
После аутентификации пользователя и создания переменных сеанса добавьте следующие строки:

$token = "/sess_" . session_id();
file_put_contents('log/' . $_SESSION['id'] . '.txt', $token);

Если вам нужно заставить пользователя выйти из системы во время cronjob или по запросу администратора:

$path = session_save_path();
$file = file_get_contents('log/xxx.txt'); // xxx is user's id
$url = $path.$file;
unlink($url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...