Разлогинивает рандомно + доступ к логину за пределами форума

Проблемы с установкой или работой phpBB 3.2.x? Получите помощь здесь!
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Pazh
Former team member
Сообщения: 2192
Зарегистрирован: 09.11.2009 17:46
Благодарил (а): 41 раз
Поблагодарили: 451 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение Pazh » 04.06.2019 13:38

BadBlock, и как к этому всему относится безопасность форума при условии что кто-то узнал cookies с автологином? Скорее всего зловред сможет безболезненно и не заметно ей пользоваться в течение 1 месяца...
форум ЖК Вестердам Помощь в ЛС/email только за WM или ЯД

Аватара пользователя
BadBlock
phpBB 1.4.3
Сообщения: 80
Зарегистрирован: 20.03.2005 21:48
Откуда: Саров, Россия
Благодарил (а): 8 раз
Поблагодарили: 8 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение BadBlock » 04.06.2019 13:58

Pazh писал(а):
04.06.2019 13:38
BadBlock, и как к этому всему относится безопасность форума при условии что кто-то узнал cookies с автологином? Скорее всего зловред сможет безболезненно и не заметно ей пользоваться в течение 1 месяца...
Очевидно, зависит от настроек безопасности - например, проверки ip, браузера.
Но в целом тут вопрос приоритетов. Юзерам рандомное разлогинивание, очевидно, досаждает. Что важнее?
Пока тестирую. Возможно, месяц перебор, недели хватит.
И разумеется, совсем правильно было бы применить более радикальное решение, описанное выше.

Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 4104
Зарегистрирован: 11.01.2005 14:29
Откуда: Питер
Благодарил (а): 107 раз
Поблагодарили: 424 раза
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение Siava » 04.06.2019 14:00

BadBlock, интересно будет узнать результаты тестирования :)
Еще одно нарушение правил и будете забанены. © Mr. Anderson
https://siava.ru/forum/ (phpbb 2.0.x, 3.1.x 3.2.x)

Аватара пользователя
BadBlock
phpBB 1.4.3
Сообщения: 80
Зарегистрирован: 20.03.2005 21:48
Откуда: Саров, Россия
Благодарил (а): 8 раз
Поблагодарили: 8 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение BadBlock » 10.06.2019 4:28

Неделя на боевом, полёт нормальный.
Против обычного наполнения таблицы сессий (6-9 тыс. записей) увеличение за счёт автологиновых сессий произошло на 1,5 тыс. записей за неделю.
На производительности не сказалось.
Жалоб на разлогинивание за неделю не поступало.
Код расширения прилагается.

Напоминаю, как пользоваться:
 
1. Выставить в админке, на странице "Общие" - "Нагрузка на сервер", большое время жизни сессии (я у себя поставил пока 30 дней, то есть, 2592000 секунд). Но мне кажется, 1-2 недель должно хватить.
2. Установить расширение Purge Sessions.
3. В настройках расширения выставить небольшое время жизни сессии — я у себя поставил 1 час, то есть, 3600 секунд.
4. Это всё.
Напоминаю, как оно работает:
 
Что происходит:

- Расширение по крону чистит протухшие сессии — старше, чем, к примеру, 1 час (точный срок — см. п.3 в инструкции выше). Но оно чистит только сессии гостей и обычные (неавтологиновые) сессии юзеров. Автологиновые сессии и ключи не трогает вообще.

- Автологиновые сессии, если они протухают, через 30 дней (точный срок — см. п.1 в инструкции выше) снесёт системный крон. Системный крон будет также пытаться продолжать чистить обычные сессии + гостевые, тут ничего не меняется, но они до этого крона уже просто не доживают, т.к. 30 дней не живут. Также системный крон продолжает чистить протухшие ключи автологина.

Что это даёт:

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

Указанная выше настройка времени жизни сессий даёт тот эффект, что автологиновые сессии для активных юзеров не протухают в течение 1 месяца (разумеется, в зависимости от настройки) — а значит, каждый день новая сессия не создаётся, т. к. юзер попадает всё время в свою предыдущую залогиненную сессию, и сценарий разлогинивания не срабатывает.

При этом моё расширение берёт на себя очистку обычных (неавтологиновых) сессий и гостевых сессий, не давая таблице сессий разбухнуть в результате выставления слишком большого времени жизни сессии.

Подчёркиваю, это временное решение.
Правильное решение в долгосрочном плане — модернизация ядра и БД чтобы использованный ключ автологина был действителен ещё в течение нескольких секунд после использования, а именно:
 
Решение требует:
1. Изменений в коде ядра.
2. Модификации имеющейся таблицы session_keys — добавления в неё 2 новых полей: "предыдущее значение ключа" и "timestamp изменения значения ключа".

Алгоритм: в момент использования ключа автологина и его регенерации предыдущее значение записываем в новое поле, во второе поле записываем текущий timestamp, чтобы знать, когда этот ключ протух. Некоторое короткое время после изменения значения на новое (несколько секунд) считаем предыдущее значение протухшего ключа валидным. В пределах этого времени при поступлении запроса со старым ключом применяем соответствующую старому значению новую залогиненную сессию и новое значение ключа и возвращаем в куках. Юзер остаётся залогиненным. Если же старое значение всё же протухло, тогда стартуем новую гостевую сессию, как и сейчас происходит в таком случае.
Вложения
ext-badblock-purgesessions.zip
(17.84 КБ) 33 скачивания

Аватара пользователя
Sheer
phpBB Guru
phpBB Guru
Сообщения: 11421
Зарегистрирован: 18.02.2007 19:01
Откуда: Рига, Латвия (страна-недоразумение)
Благодарил (а): 52 раза
Поблагодарили: 2539 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение Sheer » 10.06.2019 12:11

1. Проблема явно локальная, ибо ни разу и ни на одном форуме не наблюдал подобного поведения.
2. По расширению.
BadBlock писал(а):
10.06.2019 4:28
Решение требует:
1. Изменений в коде ядра.
Не увидел никаких инструкций по изменению кода. Если имеется ввиду
BadBlock писал(а):
10.06.2019 4:28
Модификации имеющейся таблицы session_keys
то это решается на этапе включения расширения. Подсказка: в скрипте миграции использовать функции update_schema() и revert_schema()
Непонятно, зачем городить два отдельных файла миграции, когда можно обойтись одним (к слову так делают многие разработчики, распихав их еще и по отдельным папкам - не понимаю кошерности подобного подхода).
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.

Аватара пользователя
BadBlock
phpBB 1.4.3
Сообщения: 80
Зарегистрирован: 20.03.2005 21:48
Откуда: Саров, Россия
Благодарил (а): 8 раз
Поблагодарили: 8 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение BadBlock » 10.06.2019 13:12

Решение не требует изменения кода ядра.
Никакой код менять не нужно.
Ничего делать не нужно.
Нужно поставить расширение и поменять в админке две настройки. Всё.

Пишу: решение с расширением — временное, для себя, "на коленке".
По-хорошему неплохо БЫЛО БЫ применить долгосрочное решение, для которого, в свою очередь, нужно БУДЕТ добавить два поля в таблицу ключей и внести соответствующие изменения в код ядра.
Эту идею я на досуге выскажу на phpbb.com.
Пока же вот сделал расширение, при котором ничего ни в коде, ни в БД менять НЕ НУЖНО.

Всё, что делает расширение — это чистит гостевые и неавтологиновые сессии.
Больше оно ничего не делает.
Его единственный значимый компонент - это код в директории cron.

Аватара пользователя
Siava
Поддержка
Поддержка
Сообщения: 4104
Зарегистрирован: 11.01.2005 14:29
Откуда: Питер
Благодарил (а): 107 раз
Поблагодарили: 424 раза
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение Siava » 10.06.2019 16:32

Sheer писал(а):
10.06.2019 12:11
ибо ни разу и ни на одном форуме не наблюдал подобного поведения
На этом форуме подобное поведение также присутствует. Раз в пару месяцев да выкидывает из мобильных браузеров.
Еще одно нарушение правил и будете забанены. © Mr. Anderson
https://siava.ru/forum/ (phpbb 2.0.x, 3.1.x 3.2.x)

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 14336
Зарегистрирован: 12.05.2006 18:16
Откуда: Красноярск
Благодарил (а): 343 раза
Поблагодарили: 1494 раза
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение rxu » 10.06.2019 16:45

Siava, ну это другая история, я так думаю. У топикстартера проблема разлогинивания при одновременном открытии нескольких страниц одной и той же борды одним пользователем.
Я вижу это так.
При открытии одной страницы всё хорошо - если сессия и/или ключ автологина устарели, они обновляются и всё работает дальше без поблем.
При открытии нескольких страниц сразу:
- каждая вкладка читает "старый" кукис и обращается с ним к борде;
- вкладка, обратившаяся раньше остальных, обновляет сессию, ключ автологина и кукис;
- остальные вкладки посылают данные от "старого" кукиса, в результате происходит логаут, так как той сессии из "старого" кукиса и того ключа автологина уже не существует.
BadBlock писал(а):
10.06.2019 4:28
Правильное решение в долгосрочном плане — модернизация ядра и БД чтобы использованный ключ автологина был действителен ещё в течение нескольких секунд после использования
Я бы, скорее всего, в таком случае просто повторно считывал кукис и ключ автологина, и если он валидный (новый, сгенерированный раньше всех отработавшей вкладкой), сохранял автологин без логаута.
Изображение

Аватара пользователя
igorbond
phpBB 3.0.7
Сообщения: 2453
Зарегистрирован: 09.01.2012 3:34
Благодарил (а): 564 раза
Поблагодарили: 114 раз

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение igorbond » 10.06.2019 23:55

rxu, Кстати такая же беда, если открыто несколько страниц в браузере и я захожу вновь, то приходится заново вводить пароль и это на компе, не постоянно, но периодически бывает
Изображение

Аватара пользователя
BadBlock
phpBB 1.4.3
Сообщения: 80
Зарегистрирован: 20.03.2005 21:48
Откуда: Саров, Россия
Благодарил (а): 8 раз
Поблагодарили: 8 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение BadBlock » 11.06.2019 5:50

rxu писал(а):
10.06.2019 16:45
Я бы, скорее всего, в таком случае просто повторно считывал кукис и ключ автологина, и если он валидный (новый, сгенерированный раньше всех отработавшей вкладкой), сохранял автологин без логаута.
Чем бы именно считывал повторно?
Каков механизм?

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 14336
Зарегистрирован: 12.05.2006 18:16
Откуда: Красноярск
Благодарил (а): 343 раза
Поблагодарили: 1494 раза
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение rxu » 11.06.2019 7:41

BadBlock, так, навскидку.
Где-то в /phpbb/session.php в функции function set_login_key.
Там при наличии значения ключа автологина в кукисе безусловно происходит его регенерация апдейд значения как в БД, так и в кукисе, на новое (https://github.com/phpbb/phpbb/blob/3.2 ... 1464-L1470).
В данном случае перед этим можно добавить проверку, например

Код: Выделить всё

			$sql = 'SELECT key_id, last_ip, last_login FROM ' . SESSIONS_KEYS_TABLE . '
				WHERE user_id = ' . (int) $user_id . "
					AND last_ip = '" . $db->sql_escape($user->ip) . "
					AND last_login > .  '" . time() - 1 .   '"; // для примера, берем только логин возрастом в секунду или младше
Отобранный key_id сравниваем с текущим значением ключа автологина из кукиса $this->cookie_data['k'], и если они не совпадают, просто обновлять значение в кукисе на новое, без апдейта значения в БД.
Это только в теории.
Изображение

Аватара пользователя
BadBlock
phpBB 1.4.3
Сообщения: 80
Зарегистрирован: 20.03.2005 21:48
Откуда: Саров, Россия
Благодарил (а): 8 раз
Поблагодарили: 8 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение BadBlock » 11.06.2019 8:12

То есть, предлагается, фактически, разрешить в течение секунды после логина узнавать юзера только по кукису user id (_u) и ip-адресу?

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 14336
Зарегистрирован: 12.05.2006 18:16
Откуда: Красноярск
Благодарил (а): 343 раза
Поблагодарили: 1494 раза
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение rxu » 11.06.2019 10:17

Это касается только ключа автовхода, а не всей сессии.
Изображение

Аватара пользователя
BadBlock
phpBB 1.4.3
Сообщения: 80
Зарегистрирован: 20.03.2005 21:48
Откуда: Саров, Россия
Благодарил (а): 8 раз
Поблагодарили: 8 раз
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение BadBlock » 12.06.2019 5:14

rxu писал(а):
11.06.2019 10:17
Это касается только ключа автовхода, а не всей сессии.
Если не ошибаюсь, set_login_key() вызывается в конце процесса, уже после того, как юзер аутентифицирован (или нет), сессия применена и сессионная кука установлена.
То есть, уже имеем применённую гостевую сессию, поэтому наличие ещё и валидного ключа автологина рояли при этом играть не будет.
Нужно применять всю сессию и новый ключ.

Вот сама идея идентифицировать юзера с протухшей сессией и ключом в первую секунду по имеющимся параметрам интересная, надо обдумать.
Я правильно понимаю, что идентифицировать предлагается на основе совпадения двух параметров: (1) userid из куки _u и (2) ip-адреса?
Потому что из вашего же примера:

Код: Выделить всё

				WHERE user_id = ' . (int) $user_id . "
					AND last_ip = '" . $db->sql_escape($user->ip) . "

Всё верно?

Если да, тогда имеем уже два варианта решения проблемы в ядре:

1. Мой вариант: 2 новых поля в таблике session_keys, в первые несколько секунд идентификация юзера возможна по только что протухшему ключу автологина, предыдущее значение которого нужно при автологине сохранить, используя новые поля в таблице.
2. Ваш вариант: БД не трогаем, в первые несколько секунд после автологина разрешаем идентификацию изера по ip-адресу и куке _u.

В обоих случаях применяем к юзеру его существующую автологиновую сессию, которую только что для него стартовали, отправляем ему в куках новый _sid и ключ _k.

Ну что, неплохо для начала.

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 14336
Зарегистрирован: 12.05.2006 18:16
Откуда: Красноярск
Благодарил (а): 343 раза
Поблагодарили: 1494 раза
Контактная информация:

Re: Разлогинивает рандомно + доступ к логину за пределами форума

Сообщение rxu » 12.06.2019 8:21

А может я и не в ту степь пошел. Ведь данные-то в кукисе уже обновлены от первой отработавшей вкладки.
Их просто надо считать заново в случае, если данные от другой вкладки оказываются невалидными, а last_login произошел "только что".
Изображение

Ответить

Вернуться в «Поддержка phpBB 3.2.x»