Как я создал сканер соответствия РКН: безопасно, анонимно, без компромиссов

от автора

Привет, Хабр!

Меня зовут Андрей, я веб-разработчик. Последние пару лет я, как и многие из вас, живу в состоянии лёгкого параноидального напряжения. Каждое обновление законодательства, каждый новый список запрещённых ресурсов — это не просто «ещё одна бюрократия», а реальный риск для бизнеса и репутации.

Штрафы за нарушение 152-ФЗ или размещение ссылок на экстремистские организации могут достигать 15 миллионов рублей. Блокировка домена — вопрос времени. А ведь на большинстве сайтов запрещённые элементы «вросли» в код на уровне CMS, шаблонов и CDN.

Я устал вручную искать url в консоли. Мне нужен был инструмент, который:

  • Работает в браузере — чтобы мой URL не улетал на чужой сервер.

  • Не собирает данные — zero trust, приватность, безопасность.

  • Находит всё — не только очевидные ссылки, но и скрытые в JS, CSS, шрифтах.

  • Даёт не просто список, а план действий — с оценкой времени и стоимости.

Так родился мой: просто.сканер. Ниже — не реклама, а история решения сложной задачи, с которой сталкиваются тысячи разработчиков.


1. Почему «просто проверить» — это почти невозможно

На первый взгляд, задача проста: ввёл URL → получил список запрещённых ссылок.

Но на практике — каждый шаг — подводный камень:

🔒 CORS и Same-Origin Policy

Браузер не даст вам просто так fetch’нуть чужой сайт. Это защита. Но если вы делаете анонимный сканер, вы не можете просить пользователя вводить API-ключ или использовать внешний сервер.

Решение? Я использую минимальный PHP-прокси, который только возвращает HTML. Никакой логики, никакого хранения. Вся обработка — в браузере.

if ($action === 'proxy' && isAllowedUrl($url)) {      $context = stream_context_create([          "http" => [              "method" => "GET",              "header" => "User-Agent: RKNscanBitoo/1.0\r",              "timeout" => 15,              "follow_location" => 1,              "max_redirects" => 10          ]      ]);      $content = @file_get_contents($url, false, $context);      $final_url = $url;      // Обработка редиректов      if (isset($http_response_header)) {          foreach ($http_response_header as $header) {              if (preg_match('/^Location:\s*(.*)/i', $header, $matches)) {                  $final_url = trim($matches[1]);              }          }      }      header('Content-Type: application/json; charset=utf-8');      echo json_encode(['html' => $content ?: '', 'final_url' => $final_url]);      exit;  }

Это не «серверный анализ» — это безопасный мост, который позволяет браузеру получить то, что он не может получить сам.


⚙️ Динамический контент: когда document.querySelector ничего не видит

Многие сканеры проверяют только статический HTML. Но что, если:

  • Google Fonts подгружается через JS?

  • Meta Pixel вставляется после клика?

  • Виджет WhatsApp появляется только после скролла?

Тогда grep по HTML ничего не найдёт.

Моё решение — двухэтапный подход:

  1. Онлайн-сканер — быстро проверяет все страницы, включая встроенные скрипты и стили.

  2. Локальная версия бота — для сложных случаев. Она запускается, выполняет JS, кликает, скроллит и находит то, что другие пропускают.

Это не «альтернатива», а следующий уровень уверенности.


🧠 Что считать «нарушением»?

fonts.googleapis.com — это Google, и это риск.
code.jquery.com — нет, но многие компании требуют его убрать.
cloudflare.com — технически не запрещён, но передаёт данные за рубеж.

Я не просто ищу совпадения. Я категоризирую риски:

$forbidden_patterns = [      'meta' => [          'pattern' => 'facebook\.com|instagram\.com|facebookcorewwwi\.onion|xx\.fbcdn\.net',          'color' => '#e63946',          'complexity' => 1.5,          'fix' => 'Удалить скрипты и виджеты Meta'      ],      'google' => [          'pattern' => 'google\.com|googleapis\.com|gstatic\.com|googletagmanager\.com',          'color' => '#db4437',          'complexity' => 1.8,          'fix' => 'Заменить Google Fonts на локальные или CDN'      ],      'cloudflare' => [          'pattern' => 'cloudflare\.com|cdnjs\.cloudflare\.com',          'color' => '#f48024',          'complexity' => 1.0,          'fix' => 'Рассмотреть замену на российские CDN'      ],      'whatsapp' => [          'pattern' => 'whatsapp\.com|wa\.me',          'color' => '#25D366',          'complexity' => 1.2,          'fix' => 'Удалить ссылки и виджеты WhatsApp'      ],      // ... и ещё 20+ категорий  ];

Каждая категория — с рекомендациями и оценкой сложности исправления.


2. Безопасность — не фича, а основа

Я не просто говорю «мы не собираем данные». Я доказываю это архитектурой.

Что происходит в вашем браузере:

  • Ввод URL

  • Запрос к прокси за HTML

  • Парсинг, анализ, поиск паттернов

  • Построение отчёта

Что НЕ происходит:

  • URL не сохраняется

  • HTML не отправляется дальше

  • Никаких трекеров (Google Analytics, Яндекс.Метрика, Facebook Pixel)

  • Никакой авторизации

Вы можете открыть DevTools и убедиться: единственный запрос — за HTML. Всё остальное — в вашем JavaScript.


3. Как мы определяем CMS и почему это важно

Знаете, где чаще всего прячутся запрещённые ссылки?

  • В шаблонах WordPress

  • В модулях Tilda

  • В сниппетах MODX

  • В плагинах Bitrix

Я научил сканер узнавать CMS по сигнатурам:

// Определение Tilda  if (strpos($contentLower, 'tildaforms') !== false ||      strpos($contentLower, 'tilda-blocks') !== false ||      strpos($contentLower, 'data-tilda-page') !== false) {      return ['cms' => 'Tilda', 'confidence' => 'high', 'icon' => 'tilda'];  }  // WordPress  if (preg_match('/\/wp-(content|includes)/i', $content) ||      preg_match('/name=["\']generator["\'][^>]+content=["\'][^"\']*wordpress/i', $content) ||      strpos($contentLower, 'wp-json') !== false) {      return ['cms' => 'WordPress', 'confidence' => 'high', 'icon' => 'wordpress'];  }  // Bitrix  if (preg_match('/\/bitrix\/(templates|js|components)/i', $content) ||      (is_array($headers) && isset($headers['X-Powered-By']) && stripos($headers['X-Powered-By'], 'Bitrix') !== false)) {      return ['cms' => 'Bitrix', 'confidence' => 'high', 'icon' => 'bitrix'];  }

Это позволяет:

  • Углублять сканирование — знать, где искать

  • Давать точные рекомендации — «удалите этот url» вместо «ищите в коде»

  • Оценивать сложность — исправление в CMS проще, чем в самописной CMS


4. От отчёта к плану действий

Сканер не просто говорит: «у вас есть Google Fonts». Он говорит:

⚠️ Найдены запрещённые ссылки:

instagram.com (3 вхождения)

fonts.googleapis.com (2 вхождения)

youtube.com (1 вхождение)

⏱ Оценочное время исправления: 2.5 часа

💰 Примерная стоимость: 5,000 ₽

А ещё — генерирует умный план работ:

if (!rknChecks.hasHttps)

planItems.add('<strong>Установка SSL-сертификата</strong> и настройка редиректа на HTTPS.');

if (!rknChecks.hasCookieBanner)

planItems.add('<strong>Добавление баннера</strong> с предупреждением об использовании cookie.');

if (!rknChecks.hasPrivacyPolicy)

planItems.add('<strong>Разработка и размещение</strong> Политики конфиденциальности.');

if (!rknChecks.formsOk)

planItems.add('<strong>Исправление форм</strong>: добавление чекбокса с согласием без предвыбранной галочки.');

Это не инструмент для паники, а инструмент для действия.


5. Почему это не «ещё один сканер»

На рынке есть сервисы, которые:

  • Собирают ваши данные

  • Работают медленно

  • Дают сырые списки без контекста

  • Требуют платы за базовый функционал

Мой подход:

  • Бесплатно — потому что безопасность должна быть доступной.

  • Анонимно — потому что доверие не покупается.

  • Практично — потому что разработчику нужно не «знание», а «что делать».


6. Что дальше?

Сканер уже помог проверить десятки сайтов. Но это только начало.

Планы:

  • Локальный бот — для глубокого анализа динамического контента.

  • API — для интеграции в CI/CD.

  • Плагины — для CMS.

  • Консультации — помощь в исправлении нарушений.


7. Приглашение к бета-тесту

Сервис в открытом бета-тесте: https://scan.bitoo.ru

Хочу услышать от вас:

  1. Что находит? Проверьте свои проекты.

  2. Что пропускает? Особенно — динамические вставки.

  3. Баги? Особенно в обходе ссылок.

  4. Идеи? Как улучшить отчёт?


Заключение

Я не юрист. Я — разработчик, который хочет спать спокойно, зная, что его проект не нарушает закон.

Если вы тоже устали от ручных проверок и неясных отчётов — попробуйте инструмент.
Если хотите — присоединяйтесь к развитию.
Если сомневаетесь — проверьте один раз. Риска нет.

P.S. Как вы решаете задачу соответствия РКН? Ручной аудит? Скрипты? Готовые решения? Делитесь в комментариях!


ссылка на оригинал статьи https://habr.com/ru/articles/935114/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *