Профессиональная техническая инструкция: архитектура CMP, разметка кода, JS API и HMAC-SHA256
Инженерно-юридический справочник для разработчиков и веб-студий: перехват рендера DLE, очередь onload для async-скриптов, data-атрибуты скриптов и iframe, слепок vendorsHash, клиентский JS API и крипто-журнал РКН.
JavaScript API и криптографической верификации.
1. Архитектура выполнения и жизненный цикл в DataLife Engine
Модуль спроектирован по принципу Zero-Core-Modification и интегрируется в конвейер рендеринга DLE через штатную систему виртуальных хуков dle_plugins (манифест plugin.xml):
- Точка перехвата рендера (
engine/modules/main.php): непосредственно перед финальным выводомecho $tpl->result[\'main\']вызываетсяNetauraCookieConsentFrontend::injectIntoMain($tpl->result[\'main\']). Это гарантирует 100% покрытие главной страницы, полных и кратких новостей, категорий, статических документов и кастомных модулей без ручной правки/templates//main.tpl. - Внедрение в
<head>(renderHead()): подключает изолированную таблицу стилейassets/cookieconsent.cssс кастомными CSS-переменными акцентной палитры и автоконтраста текста по формуле относительной яркости ITU-R BT.601. - Внедрение перед
</body>(renderFooter()): выводит экранированный JSON-контейнер конфигурации<script type=\"application/json\" id=\"nccConfigData\">(с флагамиJSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT), предварительно обезвреженные контейнеры скриптов категорийanalyticsиmarketing, DOM-структуру модального окна / плавающего бейджа и контроллерassets/cookieconsent.js. - Шорткод
: обрабатывается на лету как в общем буфереmain.php, так и внутри статических страниц, формируя актуальную юридическую спецификацию используемых cookies и сторонних обработчиков ПДн.
2. Движок предварительной блокировки и очередь исполнения скриптов
Для строгого соблюдения ч. 1 ст. 9 ФЗ-152 (предварительность и конкретность согласия) и исключения любых сетевых запросов к серверам третьих лиц до волеизъявления пользователя серверный метод Frontend::renderBlockedScripts() и клиентский загрузчик реализуют многоступенчатую трансформацию:
| Тип HTML-узла | Трансформация до согласия (SSR) | Поведение после согласия (CSR) |
|---|---|---|
Внешний <script src=\"...\"> |
type=\"text/plain\", src переносится в data-src (блокирует HTML preload-сканер браузера). При наличии async выставляется data-async=\"1\". |
Создаётся новый HTMLScriptElement с src из data-src; старый узел помечается data-ncc-executed=\"1\". |
Инлайновый <script>...</script> |
type=\"text/plain\" data-cookie-category=\"analytics|marketing\". Комментарии <!-- ... //--> внутри тела скрипта (например, LiveInternet) маскируются и сохраняются без искажений. |
Исполняется строго после загрузки предшествующих внешних библиотек в очереди категории. |
Сторонний фрейм <iframe src=\"...\"> |
src переносится в data-src, подставляется нейтральный about:blank и рендерится адаптивная стеклянная заглушка с кнопкой разблокировки категории в 1 клик. |
Мгновенное восстановление iframe.src = data-src и удаление блокирующего оверлея без перезагрузки страницы. |
Голый трекинг-пиксель <img src=\"https://...\"> |
Внешний URL переносится в data-src, а в src подставляется локальный прозрачный dаta:image/gif;base64,... (1×1 px). Блоки <noscript> вырезаются полностью. |
Атрибут src переключается на целевой URL пикселя только при активном разрешении категории. |
Детерминированная очередь загрузки onload и защита от гонки async
Критическая инженерная проблема классических блокировщиков — состояние гонки (race condition), когда внешний загрузчик (например, https://vk.com/js/api/openapi.js или gtag/js) имеет атрибут async, а сразу за ним следует инлайновый блок VK.Retargeting.Init(...). В cookieconsent.js реализована умная очередь loadQueue(index):
- Если за внешним скриптом в очереди категории следуют другие скрипты (
hasSubsequentScripts === true), контроллер всегда дожидается событияonload/onerrorвнешнего файла перед запуском зависимого инлайнового кода — даже если у исходного тега стоял флагdata-async=\"1\". - Преобразование в
Frontend::renderBlockedScripts()полностью идемпотентно: если разработчик вставил в админку уже размеченный тег сtype=\"text/plain\"иdata-src, дублирование атрибутов исключено.
3. Ручная HTML-разметка кастомных скриптов и медиа-фреймов в шаблоне
Если веб-студия разрабатывает индивидуальный шаблон или внедряет нестандартный виджет напрямую в .tpl-файлы (например, карту проезда, видеоплеер VK Видео / YouTube или собственный трекер), используйте штатные data-атрибуты модуля:
<!-- 1. Внешний скрипт с зависимым вызовом (категория analytics) -->
<script type=\"text/plain\" data-cookie-category=\"analytics\" data-async=\"1\" data-src=\"https://www.googletagmanager.com/gtag/js?id=G-1A2B3C4D5E\"></script>
<script type=\"text/plain\" data-cookie-category=\"analytics\">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag(\'js\', new Date());
gtag(\'config\', \'G-1A2B3C4D5E\');
</script>
<!-- 2. Блокировка стороннего iframe (карта / видеоплеер) до согласия на маркетинг -->
<iframe
data-cookie-category=\"marketing\"
data-src=\"https://yandex.ru/map-widget/v1/?um=constructor%3Aexample\"
width=\"100%\"
height=\"400\"
frameborder=\"0\">
</iframe>
<!-- 3. Произвольная кнопка вызова настроек Cookie в футере шаблона -->
<a href=\"#\" data-ncc-open=\"1\">Настройки файлов Cookie</a>
4. Контрольный отпечаток Политики (ph) и Реестра обработчиков (vh)
Состояние согласия посетителя синхронизируется между клиентским хранилищем localStorage[\'ncc_consent_v2\'] и серверной first-party cookie ncc_state. Структура объекта состояния:
{
\"u\": \"550e8400-e29b-41d4-a716-446655440000\",
\"v\": \"1.0\",
\"ph\": \"a94f1c83e02b\",
\"vh\": \"1ae2a163adec\",
\"t\": 1761920000,
\"c\": {
\"necessary\": true,
\"analytics\": true,
\"marketing\": false
}
}
v+ph(ncc_policy_hash): версия и 12-символьныйSHA-256префикс юридических параметров Политики. При изменении версии Политики баннер автоматически запрашивает актуализацию согласия.vh(ncc_vendors_hash): канонический 12-символьныйSHA-256слепок отсортированного списка активных обработчиков (vendors_analytics,vendors_marketingи флага ст. 12cross_border_warning). Если владелец сайта подключает нового стороннего подрядчика (например, добавляет Пиксель ВК к ранее работавшей Яндекс.Метрике), отпечатокvhменяется и модуль запрашивает информированное пересогласие на передачу данных новому юрлицу (с полной обратной совместимостью для старых сессий).- Автозачистка cookies при отзыве (
purgeDisallowedCookies): при отказе или отзыве категории модуль автоматически сбрасывает известные трекинговые cookies первого уровня (_ym_*,tmr_*,_ga*,_gid,_clck,_clsk,roistat_*,_ct*,carrotquest_*,_vk*,jv_*,bx_user_idи др.) по текущему хосту и корневому домену.
5. Публичный клиентский JavaScript API (window.NetauraCookieConsent)
Для интеграции со сторонними SPA-компонентами, формами обратной связи, корзинами интернет-магазинов и кастомной аналитикой модуль предоставляет глобальный объект window.NetauraCookieConsent:
// 1. Проверить, разрешена ли посетителем конкретная категория (\'necessary\' | \'analytics\' | \'marketing\')
if (window.NetauraCookieConsent && window.NetauraCookieConsent.hasConsent(\'analytics\')) {
console.log(\'Аналитика разрешена пользователем\');
}
// 2. Программно открыть окно детальных настроек Cookie (например, по клику в личном кабинете)
window.NetauraCookieConsent.openModal();
// 3. Программно принять все категории / оставить только технические / полностью отозвать согласие
window.NetauraCookieConsent.acceptAll();
window.NetauraCookieConsent.rejectAll();
window.NetauraCookieConsent.revoke(); // полный отзыв с записью события \'revoke\' в крипто-журнал РКН
6. Схема таблиц БД и криптографическая цепочка HMAC-SHA256
Все обращения к СУБД выполняются строго через штатный объект DLE $db с подготовленной очисткой параметров:
_cookie_consent_events: хранит неизменяемый реестр событийgrant,customize,reject,revokeс полямиconsent_uuid(UUID v4),user_id,ip(с поддержкой режима маскирования подсети),user_agent,categories(JSON),vendors,policy_version,policy_hash,page_url,created_atиevent_hash.- Формула целостности
event_hash: каждая запись подписывается ключом сервераHMAC-SHA256с включением хеша предыдущей строки (blockchain-like append-only log). Любая попытка изменить или удалить строку напрямую через phpMyAdmin немедленно выявляется верификаторомJournal::verifyIntegrity()в шапке админ-панели. _cookie_consent_admin_log: фиксирует все юридически значимые действия администраторов (изменение настроек, выпуск Политики, автозащита шаблона, ротация архива, экспорт выписок).
7. Криптографическая подпись обновлений RSA-2048 и RBAC-безопасность
- Разграничение прав доступа (RBAC): изменение исполняемых HTML/JS-контейнеров счётчиков, модификация
.tpl-файлов шаблона и локализация внешних ресурсов жёстко ограничены только Главными администраторами (user_group === 1) и защищены проверкой CSRF-токена$dle_login_hash. Для младших групп открывается безопасный режим Read-Only. - Верификация архивов обновлений: перед распаковкой любого пакета через «Центр обновлений» метод
NetauraCookieConsentLicense::verifyZipSignature()проверяет цифровую подпись строкиcookie-consent||{sha256(zip)}по открытому ключуRSA-2048, полностью исключая подмену дистрибутива (MITM / Supply-Chain).