Проверка CSRF/сессии и прав доступа перед действием
Комплексная проверка безопасности: CSRF токен через check_bitrix_sessid(), авторизация через $USER->IsAuthorized(), права через $USER->IsAdmin().
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Комплексная проверка безопасности перед выполнением действий: 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-ответы вместо редиректов.