В файлы, которые подключаются в index.php (а также в любые PHP-файлы компонентов, шаблонов, подключаемых файлов) в 1С-Битрикс, в само начало необходимо добавлять защитную проверку константы B_PROLOG_INCLUDED. Это предотвращает прямой вызов файла из браузера и гарантирует, что файл работает только в контексте уже запущенного ядра Битрикс (после выполнения пролога).
Стандартная конструкция для всех PHP-файлов
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
die();
}
?>
Или сокращённый вариант:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
Где это применяется
- Файлы компонентов —
class.php,.description.php,.parameters.php,template.php,component_epilog.php,result_modifier.php. - Файлы шаблонов сайта —
header.php,footer.php,template_styles.css(если PHP). - Файлы меню —
.тип_меню.menu.php,.тип_меню.menu_ext.php. - Файлы включаемых областей.
- Любые пользовательские файлы, которые вы подключаете через
require/includeвнутри публичной части.
Как устроен сам index.php
Сам index.php не требует этой проверки, поскольку он является точкой входа. Стандартная структура публичной страницы в Битрикс:
<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/header.php'); ?>
# Рабочая область (WORK_AREA) #
<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/footer.php'); ?>
А для AJAX-обработчиков (без шаблона сайта):
<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); ?>
# Код обработчика #
<?php require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php'); ?>
Зачем это нужно
Константа B_PROLOG_INCLUDED устанавливается в файле /bitrix/modules/main/include/prolog_before.php (служебная часть пролога) со значением true. Без её выполнения все функции, классы и глобальные переменные Битрикс ($APPLICATION, $USER, $DB и т.д.) не будут доступны, и прямой вызов файла из браузера приведёт к ошибке или уязвимости. Проверка die() обрывает выполнение, если файл вызван напрямую вне контекста Битрикс.