PHP
#bitrix#security#php#csrf#permissions#session#access

Проверка CSRF/сессии и прав доступа перед действием

Комплексная проверка безопасности: CSRF токен через check_bitrix_sessid(), авторизация через $USER->IsAuthorized(), права через $USER->IsAdmin().

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Комплексная проверка безопасности перед выполнением действий: CSRF токен, авторизация пользователя, права доступа. Используйте в обработчиках форм, AJAX-эндпоинтах, админ-панелях для защиты от несанкционированного доступа.

use Bitrix\Main\Loader;

/**
 * Комплексная проверка безопасности
 * @param bool $requireAuth Требовать авторизацию
 * @param bool $requireAdmin Требовать права администратора
 * @param array $allowedGroups Разрешённые группы пользователей (опционально)
 * @return array ['success' => bool, 'error' => string, 'user_id' => int]
 */
function checkSecurity($requireAuth = true, $requireAdmin = false, $allowedGroups = []) {
    global $USER;
    
    // 1. Проверка CSRF токена
    if (!check_bitrix_sessid()) {
        return [
            'success' => false,
            'error' => 'Invalid CSRF token. Please refresh the page.',
            'user_id' => 0
        ];
    }
    
    // 2. Проверка авторизации
    if ($requireAuth && !$USER->IsAuthorized()) {
        return [
            'success' => false,
            'error' => 'Authentication required',
            'user_id' => 0
        ];
    }
    
    $userId = $USER->GetID();
    
    // 3. Проверка прав администратора
    if ($requireAdmin && !$USER->IsAdmin()) {
        return [
            'success' => false,
            'error' => 'Admin access required',
            'user_id' => $userId
        ];
    }
    
    // 4. Проверка групп пользователя
    if (!empty($allowedGroups)) {
        $userGroups = $USER->GetUserGroupArray();
        $hasAccess = !empty(array_intersect($userGroups, $allowedGroups));
        
        if (!$hasAccess) {
            return [
                'success' => false,
                'error' => 'Insufficient permissions',
                'user_id' => $userId
            ];
        }
    }
    
    return [
        'success' => true,
        'error' => '',
        'user_id' => $userId
    ];
}

/**
 * Проверка безопасности с редиректом при ошибке
 * @param bool $requireAuth
 * @param bool $requireAdmin
 * @param string $redirectUrl URL для редиректа при ошибке
 * @return bool true если проверка пройдена
 */
function checkSecurityWithRedirect($requireAuth = true, $requireAdmin = false, $redirectUrl = '/') {
    $result = checkSecurity($requireAuth, $requireAdmin);
    
    if (!$result['success']) {
        // Можно установить сообщение в сессию
        $_SESSION['SECURITY_ERROR'] = $result['error'];
        LocalRedirect($redirectUrl);
        return false;
    }
    
    return true;
}

Usage:

// В обработчике формы или AJAX
// Проверка для авторизованных пользователей
$security = checkSecurity(true, false);
if (!$security['success']) {
    echo $security['error'];
    die();
}

// Проверка для администраторов
$security = checkSecurity(true, true);
if (!$security['success']) {
    header('HTTP/1.1 403 Forbidden');
    echo json_encode(['error' => $security['error']]);
    die();
}

// Проверка для определённых групп
$security = checkSecurity(true, false, [1, 5, 7]); // Группы ID: 1, 5, 7
if (!$security['success']) {
    LocalRedirect('/access-denied/');
}

// С редиректом
if (!checkSecurityWithRedirect(true, false, '/auth/')) {
    return; // Редирект уже выполнен
}

// В AJAX обработчике
if (!check_bitrix_sessid()) {
    header('Content-Type: application/json');
    echo json_encode(['success' => false, 'error' => 'CSRF token invalid']);
    die();
}

if (!$USER->IsAuthorized()) {
    header('Content-Type: application/json');
    echo json_encode(['success' => false, 'error' => 'Not authorized']);
    die();
}

Notes:

⚠️ check_bitrix_sessid() проверяет CSRF токен из $_REQUEST['sessid'] или $_POST['sessid']. $USER->IsAuthorized() проверяет авторизацию, $USER->IsAdmin() проверяет права администратора. Группа с ID=1 — администраторы по умолчанию. Всегда проверяйте безопасность ПЕРЕД выполнением действий, изменяющих данные. Для AJAX используйте JSON-ответы вместо редиректов.