PHP 5.6: тот же сеанс, назначаемый другому пользователю (неправильный вход в систему и многие другие проблемы)

Система opencart, но в любом случае, я опишу условие.

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

1- Количество посетителей не так велико, чтобы вызвать дублирование идентификаторов сеансов.
2- Это случилось внезапно.

Я использую Nginx и Apache (nginx в качестве обратного прокси-сервера), обработчик файловых сессий и php-fpm. Просто чтобы дать дополнительную информацию.

В моем php.ini длина энтропии равна 32, и она настроена на использование / dev / urandom.

Кроме того, я вставил в библиотеку файл session.php глупой, простой opencart:

class Session {
public $data = array();
public function __construct($session_id = '',  $key = 'default') {
if (!session_id()) {
ini_set('session.use_only_cookies', 'Off');
ini_set('session.use_cookies', 'On');
ini_set('session.use_trans_sid', 'Off');
ini_set('session.cookie_httponly', 'On');
if (isset($_COOKIE[session_name()]) && !preg_match('/^[a-zA-Z0-9,\-]{22,40}$/', $_COOKIE[session_name()])) {
exit();
}
if ($session_id) {
session_id($session_id);
}
session_set_cookie_params(0, '/');
session_start();
}
if (!isset($_SESSION[$key])) {
$_SESSION[$key] = array();
}
$this->data =& $_SESSION[$key];
}
public function getId() {
return session_id();
}
public function start() {
return session_start();
}
public function destroy() {
return session_destroy();
}
}

Это смущало меня несколько дней, но безрезультатно.

1

Решение

Я нашел решение, оно может работать для будущих пользователей. Проблема не имела ничего общего с OpenCart, кроме конфигурации php.

Так как я изменил путь сохранения сеанса php, php gc (сборщик мусора) по умолчанию не работал (как описано в официальной документации PHP, если путь сохранения изменяется, вы несете ответственность за очистку сеансов мусора), то не очищал сеанс. После установки моего собственного gc (сценария php, который удаляет мусорные сессии), проблема была решена.

Я написал скрипт php, который проверяет дату последнего изменения сеанса и сравнивает его с временем жизни сеанса (сроком действия), если он пройден, а затем удаляет файлы. Сценарий планируется запускать каждые 5 минут.

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector