Компонент Битрикс: проверка B_PROLOG_INCLUDED в component.php и шаблоне
Защита от прямого вызова component.php и template.php через проверку константы B_PROLOG_INCLUDED. По документации и рекомендациям 1С-Битрикс — безопасность и предсказуемое выполнение.
Как использовать
- В начале каждого component.php и каждого template.php (в шаблоне компонента) добавьте проверку в первые строки после <?php.
- Если константа не определена или не true — завершайте выполнение через die().
- Так файлы нельзя выполнить напрямую по URL или из другого контекста без ядра Битрикс.
Закрывает боль: component.php или template.php можно вызвать напрямую (по URL или из другого скрипта) — тогда не инициализированы ядро, БД, $APPLICATION, возможны ошибки и утечки логики. По рекомендациям Битрикс в каждом файле компонента и шаблона нужно проверять, что запрос прошёл через ядро.
В начале component.php:
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
// дальше логика компонента
$arResult['DATE'] = date('d.m.Y');
$this->IncludeComponentTemplate();
В начале template.php (например templates/.default/template.php):
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
?>
<div class="my-component">
<?= htmlspecialcharsbx($arResult['DATE']) ?>
</div>
Почему так: Константа B_PROLOG_INCLUDED выставляется ядром при корректном запуске скрипта (через пролог). Прямой вызов файла по HTTP или через include из постороннего скрипта не определяет её или оставляет не true — выполнение останавливается. Рекомендуется использовать во всех файлах компонента и шаблона (включая result_modifier.php, component_epilog.php при наличии).