Привет, Хабр!
Меня зовут Андрей, я веб-разработчик. Последние пару лет я, как и многие из вас, живу в состоянии лёгкого параноидального напряжения. Каждое обновление законодательства, каждый новый список запрещённых ресурсов — это не просто «ещё одна бюрократия», а реальный риск для бизнеса и репутации.
Штрафы за нарушение 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 ничего не найдёт.
Моё решение — двухэтапный подход:
-
Онлайн-сканер — быстро проверяет все страницы, включая встроенные скрипты и стили.
-
Локальная версия бота — для сложных случаев. Она запускается, выполняет 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
Хочу услышать от вас:
-
Что находит? Проверьте свои проекты.
-
Что пропускает? Особенно — динамические вставки.
-
Баги? Особенно в обходе ссылок.
-
Идеи? Как улучшить отчёт?
Заключение
Я не юрист. Я — разработчик, который хочет спать спокойно, зная, что его проект не нарушает закон.
Если вы тоже устали от ручных проверок и неясных отчётов — попробуйте инструмент.
Если хотите — присоединяйтесь к развитию.
Если сомневаетесь — проверьте один раз. Риска нет.
P.S. Как вы решаете задачу соответствия РКН? Ручной аудит? Скрипты? Готовые решения? Делитесь в комментариях!
ссылка на оригинал статьи https://habr.com/ru/articles/935114/
Добавить комментарий