Ситуация, знакомая любому, кто поддерживает чужие проекты: клиент пишет «не пускает в админку», доступов к предыдущему подрядчику нет, пароль от почты, на которую зарегистрирован администратор, тоже утерян. Времени на разбирательства — до вечера.
Ключевое здесь — не начинать с гадания, а сначала снять симптом. «Форма перезагружается» и «неверный логин» — это две совершенно разные ветки диагностики, и попытка чинить вторую, когда у вас первая, стабильно съедает час впустую.
Симптомы проблемы
| Симптом | Вероятная причина |
|---|---|
| Форма логина перезагружается без ошибок | Проблема с сессиями |
| "Неверный логин или пароль" | Забыт пароль или пользователь деактивирован |
| Пустая страница после авторизации | Ошибки PHP или памяти |
| "Доступ запрещён" | Блокировка по IP или отсутствие прав |
| Редирект на главную | Неверные настройки кук |
Дальше — решения в порядке, в котором я их обычно применяю: от самого быстрого к самому грубому.
Решение 1: Восстановление доступа через FTP
Если есть доступ к файлам сайта, создайте файл _restore_access.php в корне сайта:
<?php
// Файл: _restore_access.php
// Авторизует администратора и самоудаляется
// Защита от случайного запуска
$secretKey = 'change_me_to_random_string';
if (($_GET['key'] ?? '') !== $secretKey) {
die('Access denied. Add ?key=YOUR_SECRET_KEY');
}
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
global $USER;
// Попробуем авторизовать администратора
$adminId = 1; // ID администратора (обычно 1)
// Проверяем существование пользователя
$user = \CUser::GetByID($adminId)->Fetch();
if (!$user) {
// Ищем любого активного администратора
$admins = \CUser::GetList(
'ID', 'ASC',
['GROUPS_ID' => [1], 'ACTIVE' => 'Y'],
['FIELDS' => ['ID', 'LOGIN']]
);
if ($admin = $admins->Fetch()) {
$adminId = $admin['ID'];
echo "Используем администратора: {$admin['LOGIN']} (ID: {$adminId})<br>";
} else {
die('Активные администраторы не найдены');
}
}
// Авторизация
$USER->Authorize($adminId);
// Удаляем файл после использования
@unlink(__FILE__);
echo "Авторизация успешна. Переход в админку...<br>";
echo "<script>setTimeout(function(){ location.href='/bitrix/admin/'; }, 1000);</script>";
echo "<a href='/bitrix/admin/'>Перейти в админку</a>";Это временный бэкдор, относитесь к нему соответственно. Пока файл лежит в корне, любой, кто угадает или подсмотрит ключ, получит права администратора. Поэтому: ключ — случайная строка от 32 символов (openssl rand -hex 32), удаление сразу после использования и обязательная ручная проверка, что файла больше нет. @unlink(__FILE__) может тихо не сработать, если у процесса нет прав на запись в директорию, — глушитель ошибок вам об этом не скажет.
Запуск: https://site.ru/_restore_access.php?key=ваш_секретный_ключ
Решение 2: Проблема с сессиями
Если форма логина просто перезагружается без сообщений об ошибке — скорее всего повреждены директории сессий.
Диагностика
# Проверяем директории сессий
ls -la /tmp/php_sessions/
ls -la /tmp/php_sessions/www/
# Проверяем права
stat /tmp/php_sessions/Восстановление (BitrixVM)
# Создаём директории
mkdir -p /tmp/php_sessions/www/
mkdir -p /tmp/php_sessions/ext_www/
mkdir -p /tmp/php_upload/www/
# Устанавливаем владельца
chown -R bitrix:bitrix /tmp/php_sessions/
chown -R bitrix:bitrix /tmp/php_upload/
# Права доступа
chmod 770 /tmp/php_sessions/
chmod 770 /tmp/php_upload/Восстановление (стандартный хостинг)
# Проверяем путь к сессиям
php -i | grep session.save_path
# Создаём и настраиваем
mkdir -p /var/lib/php/sessions
chown www-data:www-data /var/lib/php/sessions
chmod 1733 /var/lib/php/sessionsПочему сессии ломаются именно так: Битрикс не отдаёт ошибку авторизации, если сессия не сохранилась. С его точки зрения логин прошёл, просто на следующем запросе пользователь снова аноним — отсюда бесконечная перезагрузка формы без единого сообщения. Чаще всего виноваты забитый /tmp, слетевшие после переноса права на директорию сессий или её отсутствие после чистки диска.
Решение 3: Сброс пароля через БД
При доступе к базе данных можно сбросить пароль напрямую:
-- Проверяем пользователя
SELECT ID, LOGIN, ACTIVE, BLOCKED FROM b_user WHERE ID = 1;
-- Активируем если заблокирован
UPDATE b_user SET ACTIVE = 'Y', BLOCKED = 'N' WHERE ID = 1;
-- Сбрасываем пароль (временный: admin123)
-- ВАЖНО: Это MD5 хэш, он слабый! Смените пароль сразу после входа
UPDATE b_user SET PASSWORD = 'f6fdffe48c908deb0f4c3bd36c032e72' WHERE ID = 1;Про MD5-хэш без соли. Битрикс поддерживает такой формат ради обратной совместимости со старыми версиями, но пароль, записанный этим запросом, хранится в базе фактически в открытом виде — MD5 от короткой строки подбирается по радужным таблицам мгновенно. Считайте такой пароль одноразовым: зашли — сразу сменили через интерфейс, чтобы Битрикс пересчитал хэш со своей солью. И проверьте, что рядом не осталось второго администратора с таким же «временным» паролем от прошлого инцидента.
Перед любым UPDATE по b_user снимите дамп таблицы. Ошибиться в WHERE и обнулить пароли всем пользователям сайта — сценарий редкий, но крайне запоминающийся.
Решение 4: Блокировка по IP
Проверка в .htaccess
cat /home/bitrix/www/.htaccess | grep -i denyПроверка в настройках проактивной защиты
<?php
// Файл: check_ip_block.php
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
$ip = $_SERVER['REMOTE_ADDR'];
echo "Ваш IP: {$ip}<br>";
// Проверка в таблице блокировок
global $DB;
$blocked = $DB->Query("SELECT * FROM b_sec_iprule WHERE ACTIVE='Y'")->Fetch();
if ($blocked) {
echo "Есть правила блокировки IP:<br>";
print_r($blocked);
}Отключение проактивной защиты
# Через консоль
php -r "
require '/home/bitrix/www/bitrix/modules/main/include/prolog_before.php';
\Bitrix\Main\Config\Option::set('security', 'ipcheck_disable_file', '/tmp/.enable_ipcheck');
echo 'IP-проверка временно отключена';
"Решение 5: Ошибки PHP
Включение отладки
Создайте файл /bitrix/.settings_extra.php:
<?php
return [
'exception_handling' => [
'value' => [
'debug' => true,
'log' => [
'settings' => [
'file' => '/var/log/bitrix/error.log',
'log_size' => 10000000,
],
],
],
'readonly' => false,
],
];Проверка логов
# Логи PHP
tail -100 /var/log/php-fpm/www-error.log
# Логи Битрикса
tail -100 /home/bitrix/www/bitrix/logs/error.log
# Логи веб-сервера
tail -100 /var/log/nginx/error.logЧек-лист диагностики
#!/bin/bash
# Скрипт диагностики проблем авторизации
echo "=== Диагностика админки Битрикс ==="
echo -e "\n1. Проверка сессий:"
ls -la /tmp/php_sessions/ 2>/dev/null || echo "Директория сессий не найдена!"
echo -e "\n2. Свободное место:"
df -h /tmp /var
echo -e "\n3. Права на директории:"
stat /tmp/php_sessions/ 2>/dev/null | grep -E "(Access|Uid|Gid)"
echo -e "\n4. Последние ошибки PHP:"
tail -5 /var/log/php-fpm/www-error.log 2>/dev/null || echo "Лог не найден"
echo -e "\n5. Проверка .htaccess:"
grep -i "deny\|allow" /home/bitrix/www/.htaccess 2>/dev/null | head -5
echo -e "\n6. Статус PHP-FPM:"
systemctl status php-fpm --no-pager | head -5
echo -e "\nДиагностика завершена"Профилактика
Всё, что перечислено ниже, я настраиваю на этапе приёмки проекта — именно потому, что каждый пункт когда-то стоил мне вечера.
- Запасной аккаунт администратора с отдельным паролем в менеджере паролей. Самый дешёвый способ никогда не читать эту статью снова.
- Мониторинг свободного места на
/tmpи/var. Переполненный диск ломает сессии первым делом, а выглядит это как «сайт работает, но не пускает в админку». - Свой IP в whitelist проактивной защиты. Иначе однажды вы заблокируете сами себя отладочными запросами.
- Бэкапы с проверкой восстановления, включая
b_user. Бэкап, который ни разу не разворачивали, — это не бэкап.
Итоги
Порядок действий, экономящий больше всего времени: определить симптом по таблице выше → проверить сессии и свободное место (это причина в большинстве случаев) → и только потом лезть в базу и сбрасывать пароли. Восстановление через файл в корне — рабочий инструмент, но помните, что на время его существования сайт открыт: сделали дело — убрали за собой.
Совет: Если проблема повторяется регулярно, проверьте настройки cron-задачи очистки сессий и убедитесь, что она не удаляет активные сессии.
Комментарии
Система комментариев скоро будет подключена. А пока вы можете написать мне в Telegram или на email.