Yandex Metrika
sanches.free 1 просмотр

Ссылка «Выйти» в Битрикс после обновления 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 дней гарантии