Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.
Разлогинивает рандомно + доступ к логину за пределами форума
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB 3.1.x/3.2.x | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ).
-
- Former team member
- Сообщения: 2317
- Стаж: 14 лет 5 месяцев
- Благодарил (а): 37 раз
- Поблагодарили: 261 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
BadBlock, и как к этому всему относится безопасность форума при условии что кто-то узнал cookies с автологином? Скорее всего зловред сможет безболезненно и не заметно ей пользоваться в течение 1 месяца...
Помощь в ЛС/email только за WM или ЮMoney
-
- phpBB 1.4.3
- Сообщения: 92
- Стаж: 19 лет
- Откуда: Саров, Россия
- Благодарил (а): 8 раз
- Поблагодарили: 14 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
Очевидно, зависит от настроек безопасности - например, проверки ip, браузера.
Но в целом тут вопрос приоритетов. Юзерам рандомное разлогинивание, очевидно, досаждает. Что важнее?
Пока тестирую. Возможно, месяц перебор, недели хватит.
И разумеется, совсем правильно было бы применить более радикальное решение, описанное выше.
-
- Поддержка
- Сообщения: 5277
- Стаж: 19 лет 3 месяца
- Откуда: Питер
- Благодарил (а): 186 раз
- Поблагодарили: 790 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
BadBlock, интересно будет узнать результаты тестирования
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb2.0.x 3.5.x)
Ты очистил кеш? © Sheer
https://siava.ru (phpbb
-
- phpBB 1.4.3
- Сообщения: 92
- Стаж: 19 лет
- Откуда: Саров, Россия
- Благодарил (а): 8 раз
- Поблагодарили: 14 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
Неделя на боевом, полёт нормальный.
Против обычного наполнения таблицы сессий (6-9 тыс. записей) увеличение за счёт автологиновых сессий произошло на 1,5 тыс. записей за неделю.
На производительности не сказалось.
Жалоб на разлогинивание за неделю не поступало.
Код расширения прилагается.
Напоминаю, как пользоваться:
Напоминаю, как оно работает:
Подчёркиваю, это временное решение.
Правильное решение в долгосрочном плане — модернизация ядра и БД чтобы использованный ключ автологина был действителен ещё в течение нескольких секунд после использования, а именно:
Против обычного наполнения таблицы сессий (6-9 тыс. записей) увеличение за счёт автологиновых сессий произошло на 1,5 тыс. записей за неделю.
На производительности не сказалось.
Жалоб на разлогинивание за неделю не поступало.
Код расширения прилагается.
Напоминаю, как пользоваться:
1. Выставить в админке, на странице "Общие" - "Нагрузка на сервер", большое время жизни сессии (я у себя поставил пока 30 дней, то есть, 2592000 секунд). Но мне кажется, 1-2 недель должно хватить.
2. Установить расширение Purge Sessions.
3. В настройках расширения выставить небольшое время жизни сессии — я у себя поставил 1 час, то есть, 3600 секунд.
4. Это всё.
2. Установить расширение Purge Sessions.
3. В настройках расширения выставить небольшое время жизни сессии — я у себя поставил 1 час, то есть, 3600 секунд.
4. Это всё.
Что происходит:
- Расширение по крону чистит протухшие сессии — старше, чем, к примеру, 1 час (точный срок — см. п.3 в инструкции выше). Но оно чистит только сессии гостей и обычные (неавтологиновые) сессии юзеров. Автологиновые сессии и ключи не трогает вообще.
- Автологиновые сессии, если они протухают, через 30 дней (точный срок — см. п.1 в инструкции выше) снесёт системный крон. Системный крон будет также пытаться продолжать чистить обычные сессии + гостевые, тут ничего не меняется, но они до этого крона уже просто не доживают, т.к. 30 дней не живут. Также системный крон продолжает чистить протухшие ключи автологина.
Что это даёт:
Вылет автологиновых сессий по описанному сценарию происходит у юзеров, которые после протухания сессии сразу открывают несколько страниц за раз (восстановление вкладок, менеджер сессий в браузере, просто быстро тыкают и пр.). Так действовать может только наиболее активный "костяк" форума, доставлять неприятности которому хочется меньше всего. Если они ставят галку "запомнить меня", нужно сделать всё, чтобы оно работало.
Указанная выше настройка времени жизни сессий даёт тот эффект, что автологиновые сессии для активных юзеров не протухают в течение 1 месяца (разумеется, в зависимости от настройки) — а значит, каждый день новая сессия не создаётся, т. к. юзер попадает всё время в свою предыдущую залогиненную сессию, и сценарий разлогинивания не срабатывает.
При этом моё расширение берёт на себя очистку обычных (неавтологиновых) сессий и гостевых сессий, не давая таблице сессий разбухнуть в результате выставления слишком большого времени жизни сессии.
- Расширение по крону чистит протухшие сессии — старше, чем, к примеру, 1 час (точный срок — см. п.3 в инструкции выше). Но оно чистит только сессии гостей и обычные (неавтологиновые) сессии юзеров. Автологиновые сессии и ключи не трогает вообще.
- Автологиновые сессии, если они протухают, через 30 дней (точный срок — см. п.1 в инструкции выше) снесёт системный крон. Системный крон будет также пытаться продолжать чистить обычные сессии + гостевые, тут ничего не меняется, но они до этого крона уже просто не доживают, т.к. 30 дней не живут. Также системный крон продолжает чистить протухшие ключи автологина.
Что это даёт:
Вылет автологиновых сессий по описанному сценарию происходит у юзеров, которые после протухания сессии сразу открывают несколько страниц за раз (восстановление вкладок, менеджер сессий в браузере, просто быстро тыкают и пр.). Так действовать может только наиболее активный "костяк" форума, доставлять неприятности которому хочется меньше всего. Если они ставят галку "запомнить меня", нужно сделать всё, чтобы оно работало.
Указанная выше настройка времени жизни сессий даёт тот эффект, что автологиновые сессии для активных юзеров не протухают в течение 1 месяца (разумеется, в зависимости от настройки) — а значит, каждый день новая сессия не создаётся, т. к. юзер попадает всё время в свою предыдущую залогиненную сессию, и сценарий разлогинивания не срабатывает.
При этом моё расширение берёт на себя очистку обычных (неавтологиновых) сессий и гостевых сессий, не давая таблице сессий разбухнуть в результате выставления слишком большого времени жизни сессии.
Подчёркиваю, это временное решение.
Правильное решение в долгосрочном плане — модернизация ядра и БД чтобы использованный ключ автологина был действителен ещё в течение нескольких секунд после использования, а именно:
Решение требует:
1. Изменений в коде ядра.
2. Модификации имеющейся таблицы session_keys — добавления в неё 2 новых полей: "предыдущее значение ключа" и "timestamp изменения значения ключа".
Алгоритм: в момент использования ключа автологина и его регенерации предыдущее значение записываем в новое поле, во второе поле записываем текущий timestamp, чтобы знать, когда этот ключ протух. Некоторое короткое время после изменения значения на новое (несколько секунд) считаем предыдущее значение протухшего ключа валидным. В пределах этого времени при поступлении запроса со старым ключом применяем соответствующую старому значению новую залогиненную сессию и новое значение ключа и возвращаем в куках. Юзер остаётся залогиненным. Если же старое значение всё же протухло, тогда стартуем новую гостевую сессию, как и сейчас происходит в таком случае.
1. Изменений в коде ядра.
2. Модификации имеющейся таблицы session_keys — добавления в неё 2 новых полей: "предыдущее значение ключа" и "timestamp изменения значения ключа".
Алгоритм: в момент использования ключа автологина и его регенерации предыдущее значение записываем в новое поле, во второе поле записываем текущий timestamp, чтобы знать, когда этот ключ протух. Некоторое короткое время после изменения значения на новое (несколько секунд) считаем предыдущее значение протухшего ключа валидным. В пределах этого времени при поступлении запроса со старым ключом применяем соответствующую старому значению новую залогиненную сессию и новое значение ключа и возвращаем в куках. Юзер остаётся залогиненным. Если же старое значение всё же протухло, тогда стартуем новую гостевую сессию, как и сейчас происходит в таком случае.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Former team member
- Сообщения: 12113
- Стаж: 17 лет 1 месяц
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 41 раз
- Поблагодарили: 1716 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
1. Проблема явно локальная, ибо ни разу и ни на одном форуме не наблюдал подобного поведения.
2. По расширению.
Непонятно, зачем городить два отдельных файла миграции, когда можно обойтись одним (к слову так делают многие разработчики, распихав их еще и по отдельным папкам - не понимаю кошерности подобного подхода).
2. По расширению.
Не увидел никаких инструкций по изменению кода. Если имеется ввиду
то это решается на этапе включения расширения. Подсказка: в скрипте миграции использовать функции
update_schema()
и revert_schema()
Непонятно, зачем городить два отдельных файла миграции, когда можно обойтись одним (к слову так делают многие разработчики, распихав их еще и по отдельным папкам - не понимаю кошерности подобного подхода).
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
-
- phpBB 1.4.3
- Сообщения: 92
- Стаж: 19 лет
- Откуда: Саров, Россия
- Благодарил (а): 8 раз
- Поблагодарили: 14 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
Решение не требует изменения кода ядра.
Никакой код менять не нужно.
Ничего делать не нужно.
Нужно поставить расширение и поменять в админке две настройки. Всё.
Пишу: решение с расширением — временное, для себя, "на коленке".
По-хорошему неплохо БЫЛО БЫ применить долгосрочное решение, для которого, в свою очередь, нужно БУДЕТ добавить два поля в таблицу ключей и внести соответствующие изменения в код ядра.
Эту идею я на досуге выскажу на phpbb.com.
Пока же вот сделал расширение, при котором ничего ни в коде, ни в БД менять НЕ НУЖНО.
Всё, что делает расширение — это чистит гостевые и неавтологиновые сессии.
Больше оно ничего не делает.
Его единственный значимый компонент - это код в директории cron.
Никакой код менять не нужно.
Ничего делать не нужно.
Нужно поставить расширение и поменять в админке две настройки. Всё.
Пишу: решение с расширением — временное, для себя, "на коленке".
По-хорошему неплохо БЫЛО БЫ применить долгосрочное решение, для которого, в свою очередь, нужно БУДЕТ добавить два поля в таблицу ключей и внести соответствующие изменения в код ядра.
Эту идею я на досуге выскажу на phpbb.com.
Пока же вот сделал расширение, при котором ничего ни в коде, ни в БД менять НЕ НУЖНО.
Всё, что делает расширение — это чистит гостевые и неавтологиновые сессии.
Больше оно ничего не делает.
Его единственный значимый компонент - это код в директории cron.
-
- Поддержка
- Сообщения: 5277
- Стаж: 19 лет 3 месяца
- Откуда: Питер
- Благодарил (а): 186 раз
- Поблагодарили: 790 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
На этом форуме подобное поведение также присутствует. Раз в пару месяцев да выкидывает из мобильных браузеров.
Еще одно нарушение правил и будете забанены. © Mr. Anderson
Ты очистил кеш? © Sheer
https://siava.ru (phpbb2.0.x 3.5.x)
Ты очистил кеш? © Sheer
https://siava.ru (phpbb
-
- phpBB Guru
- Сообщения: 16357
- Стаж: 17 лет 11 месяцев
- Откуда: Красноярск
- Благодарил (а): 521 раз
- Поблагодарили: 1740 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
Siava, ну это другая история, я так думаю. У топикстартера проблема разлогинивания при одновременном открытии нескольких страниц одной и той же борды одним пользователем.
Я вижу это так.
При открытии одной страницы всё хорошо - если сессия и/или ключ автологина устарели, они обновляются и всё работает дальше без поблем.
При открытии нескольких страниц сразу:
- каждая вкладка читает "старый" кукис и обращается с ним к борде;
- вкладка, обратившаяся раньше остальных, обновляет сессию, ключ автологина и кукис;
- остальные вкладки посылают данные от "старого" кукиса, в результате происходит логаут, так как той сессии из "старого" кукиса и того ключа автологина уже не существует.
Я вижу это так.
При открытии одной страницы всё хорошо - если сессия и/или ключ автологина устарели, они обновляются и всё работает дальше без поблем.
При открытии нескольких страниц сразу:
- каждая вкладка читает "старый" кукис и обращается с ним к борде;
- вкладка, обратившаяся раньше остальных, обновляет сессию, ключ автологина и кукис;
- остальные вкладки посылают данные от "старого" кукиса, в результате происходит логаут, так как той сессии из "старого" кукиса и того ключа автологина уже не существует.
Я бы, скорее всего, в таком случае просто повторно считывал кукис и ключ автологина, и если он валидный (новый, сгенерированный раньше всех отработавшей вкладкой), сохранял автологин без логаута.
-
- phpBB 3.1.0 RC2
- Сообщения: 3232
- Стаж: 12 лет 3 месяца
- Благодарил (а): 704 раза
- Поблагодарили: 152 раза
Re: Разлогинивает рандомно + доступ к логину за пределами форума
rxu, Кстати такая же беда, если открыто несколько страниц в браузере и я захожу вновь, то приходится заново вводить пароль и это на компе, не постоянно, но периодически бывает
-
- phpBB 1.4.3
- Сообщения: 92
- Стаж: 19 лет
- Откуда: Саров, Россия
- Благодарил (а): 8 раз
- Поблагодарили: 14 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
Чем бы именно считывал повторно?
Каков механизм?
-
- phpBB Guru
- Сообщения: 16357
- Стаж: 17 лет 11 месяцев
- Откуда: Красноярск
- Благодарил (а): 521 раз
- Поблагодарили: 1740 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
BadBlock, так, навскидку.
Где-то в
Там при наличии значения ключа автологина в кукисе безусловно происходит его регенерация апдейд значения как в БД, так и в кукисе, на новое (https://github.com/phpbb/phpbb/blob/3.2 ... 1464-L1470).
В данном случае перед этим можно добавить проверку, например
Отобранный
Это только в теории.
Где-то в
/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']
, и если они не совпадают, просто обновлять значение в кукисе на новое, без апдейта значения в БД.Это только в теории.
-
- phpBB 1.4.3
- Сообщения: 92
- Стаж: 19 лет
- Откуда: Саров, Россия
- Благодарил (а): 8 раз
- Поблагодарили: 14 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
То есть, предлагается, фактически, разрешить в течение секунды после логина узнавать юзера только по кукису user id (
_u
) и ip-адресу?-
- phpBB Guru
- Сообщения: 16357
- Стаж: 17 лет 11 месяцев
- Откуда: Красноярск
- Благодарил (а): 521 раз
- Поблагодарили: 1740 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
Это касается только ключа автовхода, а не всей сессии.
-
- phpBB 1.4.3
- Сообщения: 92
- Стаж: 19 лет
- Откуда: Саров, Россия
- Благодарил (а): 8 раз
- Поблагодарили: 14 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
Если не ошибаюсь,
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
. Ну что, неплохо для начала.
-
- phpBB Guru
- Сообщения: 16357
- Стаж: 17 лет 11 месяцев
- Откуда: Красноярск
- Благодарил (а): 521 раз
- Поблагодарили: 1740 раз
Re: Разлогинивает рандомно + доступ к логину за пределами форума
А может я и не в ту степь пошел. Ведь данные-то в кукисе уже обновлены от первой отработавшей вкладки.
Их просто надо считать заново в случае, если данные от другой вкладки оказываются невалидными, а
Их просто надо считать заново в случае, если данные от другой вкладки оказываются невалидными, а
last_login
произошел "только что".