Инструкция • Обновлено: 31.10.2026

Профессиональная техническая инструкция: архитектура CMP, разметка кода, JS API и HMAC-SHA256

Инженерно-юридический справочник для разработчиков и веб-студий: перехват рендера DLE, очередь onload для async-скриптов, data-атрибуты скриптов и iframe, слепок vendorsHash, клиентский JS API и крипто-журнал РКН.

Назначение документа: эталонное инженерно-юридическое руководство для веб-разработчиков, системных интеграторов, технических директоров и DPO-специалистов по внутренней архитектуре NetAura Cookie Consent PRO v2.4+, протоколам предварительной блокировки трекеров, клиентскому 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 и флага ст. 12 cross_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).
Статья была полезна?
КонсультантНе в сети
Тестовый призыв!
Сейчас мы не в сети. Оставьте заявку, и мы с вами свяжемся.
Telegram
support@netaura.ru
Заказать обратный звонок