Bitrix: безопасный AJAX-обработчик (prolog_before.php, Context, sessid)
Минимально безопасный кастомный обработчик: только POST, check_bitrix_sessid(), авторизация через CUser, валидация ввода. По документации 1С-Битрикс (Context, Request).
Как использовать
- Разместите файл в /local/php_interface/ или подключаемом каталоге; вызывайте только через POST с передачей sessid.
- В форме/JS передавайте sessid из BX.bitrix_sessid() или из скрытого поля с bitrix_sessid.
- Для публичных действий авторизацию можно не требовать — но проверка sessid и POST обязательна.
Безопасный кастомный AJAX-обработчик для 1С-Битрикс: подключается через prolog_before.php, использует D7 Context и Request, проверку сессии check_bitrix_sessid() и при необходимости авторизацию через глобальный $USER. Соответствует рекомендациям по безопасности на dev.1c-bitrix.ru и API Context::getCurrent(), getRequest().
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Context;
$request = Context::getCurrent()->getRequest();
// Только POST
if (!$request->isPost()) {
die('Access denied');
}
// Обязательная проверка сессии Bitrix (CSRF)
if (!check_bitrix_sessid()) {
die('Access denied');
}
// Если обработчик только для авторизованных пользователей
global $USER;
if (!$USER->IsAuthorized()) {
die('Access denied');
}
$data = $request->getPost('data');
if ($data === null || $data === '') {
die('Invalid input');
}
// Вывод только после проверки и при необходимости — экранирование
echo htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
Когда не требовать авторизацию
Если обработчик доступен гостям (например, отправка формы обратной связи), блок с $USER->IsAuthorized() можно убрать. Проверки метода (POST) и check_bitrix_sessid() оставляйте всегда.
Замечания
check_bitrix_sessid()проверяет параметрsessidиз запроса; без него обработчик не вызывайте.Context::getCurrent()->getRequest()— официальный D7 API;$request->isPost(),$request->getPost('data')— методы объекта Request.- Глобальный
$USER(CUser) и$USER->IsAuthorized()описаны в документации главного модуля.