Ссылка «Выйти» в Битрикс после обновления main 20.x: sessid и CSRF
Почему «Выйти» перестало срабатывать
На свежих версиях ядра (модуль main, ориентир — ветка 20.100 и новее) обычная ссылка вида ?logout=yes часто перестаёт разлогинивать пользователя. Это связано не с шаблоном, а с тем, что форма выхода должна проходить проверку токена сессии против подделки межсайтовых запросов.
Отключать ли защиту в админке
В настройках главного модуля, вкладка «Авторизация», есть переключатели контроля CSRF для сценариев входа и выхода. Теоретически можно ослабить проверку, но для публичного сайта это обычно шаг назад по безопасности. Рациональнее оставить защиту активной и поправить разметку ссылки.
Рабочий URL с маркером сессии
Нужно дописать к строке запроса результат bitrix_sessid_get(): тогда ядро увидит валидный sessid и корректно завершит авторизацию. Удобно собрать ссылку через GetCurPageParam(), одновременно убрав из QUERY_STRING параметры авторизации, чтобы не получить конфликтующие ключи.
global $APPLICATION;
$queryStripList = [
'login',
'logout',
'register',
'forgot_password',
'change_password',
];
$logoutTarget = $APPLICATION->GetCurPageParam(
'logout=yes&' . bitrix_sessid_get(),
$queryStripList
);
echo htmlspecialcharsbx($logoutTarget);В готовом адресе появится пара вида logout=yes&sessid=…; именно её стоит отдавать в пунктах меню личного кабинета и кастомных блоках профиля.
На что смотреть при вёрстке
- Не кэшируйте HTML с персональным
sessidв общем compositе или статическом HTML без исключений — иначе разные посетители получат чужой токен. - Если ссылка собирается в JS, лучше отдать с сервера готовый путь или вынести только значение
sessidв data-атрибут, а не дублировать логику на клиенте. - Список ключей в
$queryStripListрасширяйте, если в URL проекта навешаны собственные параметры логина и восстановления пароля.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии