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

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

Штрафы за нарушение 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. Как вы решаете задачу соответствия РКН? Ручной аудит? Скрипты? Готовые решения? Делитесь в комментариях!

Комментарии (31)


  1. Nurked
    07.08.2025 15:26

    Никак не могу не вспомнить замечательный мультик под названием "Когда дует ветер".

    Там тоже рассказ о двух очень законопослушных жителей Англии, которые очень законопослушно следовали всем заявлениям и буклетам правительства о том, что надо делать в случае ядерной атаки.

    Атака была, и чисто случайно они выжили, следуя этим же брошюрам, заявлениям и газетным вырезкам. Конец, правда, был совсем не прекрасный для обоих. Смешной, местами. Весёлый, до некоторых пор. Только не до последнего весёлый.

    А вы на этих брошюрах ещё и зарабатываете.


    1. bitoo Автор
      07.08.2025 15:26

      О, мультфильм "Когда дует ветер" — как глоток прохладной воды посреди административного зноя. Эти двое англичан, которые до последнего момента проверяют:

      • Закрыта ли дверь в убежище? ✅

      • Подключён ли фильтр воздуха? ✅

      • Есть ли запас туалетной бумаги? ✅

      • А радио работает? ❌ (о, нет, опять fonts.googleapis.com в @import)


      1. Nurked
        07.08.2025 15:26

        Но как показывает практика, ваш сканер даже этого не делает. См комменты ниже.


        1. bitoo Автор
          07.08.2025 15:26

          ✔️ Да, сканер ещё в бета-режиме, и да, он не всесильный — но на это бросаются все силы, чтобы он был полезным. Это бесплатный инструмент, не обязывающий никого ни к чему.
          Все комментарии были учтены и ряд улучшений уже сделаны. Если и у вас имеются по делу какие-то предложения, я с удовольствием выслушаю. В любом случае, благодарю за ваше мнение.


  1. nick758
    07.08.2025 15:26

    Facebook

    Скрытый текст


    1. pqbd
      07.08.2025 15:26

      Ну, знаете...


    1. pqbd
      07.08.2025 15:26

      Кое-как натравил его на себя...


      1. bitoo Автор
        07.08.2025 15:26

        Спасибо за внимательность и отличный пример! Вы абсолютно правы — это настоящая проблема, и она связана с тем, как сканер обрабатывает HTTP/HTTPS-редиректы.

        Что сейчас происходит:
        Когда вы вводите http://, а сайт редиректит на https://, наш сканер пока не всегда корректно следует за редиректом и может начать анализ по первоначальному HTTP-адресу. В результате:

        Он не видит HTTPS-версию.
        Считает, что SSL отсутствует.
        Выдаёт ложное предупреждение.
        Почему так происходит:
        Сканер работает в браузере, и при прямом запросе к HTTP-адресу он не всегда "видит" финальный URL после редиректа, особенно если перенаправление происходит на уровне сервера (301/302).


        1. pqbd
          07.08.2025 15:26

          :-) пожалуйста. Как говорится, с вас 3000₽ ;-)