Привет, Хабр!
Меня зовут Андрей, я веб-разработчик. Последние пару лет я, как и многие из вас, живу в состоянии лёгкого параноидального напряжения. Каждое обновление законодательства, каждый новый список запрещённых ресурсов — это не просто «ещё одна бюрократия», а реальный риск для бизнеса и репутации.
Штрафы за нарушение 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. Как вы решаете задачу соответствия РКН? Ручной аудит? Скрипты? Готовые решения? Делитесь в комментариях!
Комментарии (31)
nick758
07.08.2025 15:26Facebook
Скрытый текст
pqbd
07.08.2025 15:26Кое-как натравил его на себя...
bitoo Автор
07.08.2025 15:26Спасибо за внимательность и отличный пример! Вы абсолютно правы — это настоящая проблема, и она связана с тем, как сканер обрабатывает HTTP/HTTPS-редиректы.
Что сейчас происходит:
Когда вы вводите http://, а сайт редиректит на https://, наш сканер пока не всегда корректно следует за редиректом и может начать анализ по первоначальному HTTP-адресу. В результате:Он не видит HTTPS-версию.
Считает, что SSL отсутствует.
Выдаёт ложное предупреждение.
Почему так происходит:
Сканер работает в браузере, и при прямом запросе к HTTP-адресу он не всегда "видит" финальный URL после редиректа, особенно если перенаправление происходит на уровне сервера (301/302).
Nurked
Никак не могу не вспомнить замечательный мультик под названием "Когда дует ветер".
Там тоже рассказ о двух очень законопослушных жителей Англии, которые очень законопослушно следовали всем заявлениям и буклетам правительства о том, что надо делать в случае ядерной атаки.
Атака была, и чисто случайно они выжили, следуя этим же брошюрам, заявлениям и газетным вырезкам. Конец, правда, был совсем не прекрасный для обоих. Смешной, местами. Весёлый, до некоторых пор. Только не до последнего весёлый.
А вы на этих брошюрах ещё и зарабатываете.
bitoo Автор
О, мультфильм "Когда дует ветер" — как глоток прохладной воды посреди административного зноя. Эти двое англичан, которые до последнего момента проверяют:
Закрыта ли дверь в убежище? ✅
Подключён ли фильтр воздуха? ✅
Есть ли запас туалетной бумаги? ✅
А радио работает? ❌ (о, нет, опять
fonts.googleapis.com
в@import
)Nurked
Но как показывает практика, ваш сканер даже этого не делает. См комменты ниже.
bitoo Автор
✔️ Да, сканер ещё в бета-режиме, и да, он не всесильный — но на это бросаются все силы, чтобы он был полезным. Это бесплатный инструмент, не обязывающий никого ни к чему.
Все комментарии были учтены и ряд улучшений уже сделаны. Если и у вас имеются по делу какие-то предложения, я с удовольствием выслушаю. В любом случае, благодарю за ваше мнение.