惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
L
Lohrmann on Cybersecurity
Simon Willison's Weblog
Simon Willison's Weblog
P
Proofpoint News Feed
P
Privacy International News Feed
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
S
Securelist
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
GbyAI
GbyAI
B
Blog RSS Feed
A
About on SuperTechFans
C
CXSECURITY Database RSS Feed - CXSecurity.com
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyberwarzone
Cyberwarzone
I
Intezer
T
Tor Project blog
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
aimingoo的专栏
aimingoo的专栏
Cisco Talos Blog
Cisco Talos Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
W
WeLiveSecurity
D
DataBreaches.Net
U
Unit 42
Project Zero
Project Zero
Martin Fowler
Martin Fowler
V
V2EX
The Last Watchdog
The Last Watchdog
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Cisco Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V2EX - 技术
V2EX - 技术
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tenable Blog
F
Full Disclosure
T
The Exploit Database - CXSecurity.com
H
Heimdal Security Blog
Latest news
Latest news
Webroot Blog
Webroot Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Шрифтовые иски в РФ: 15,3 млн ₽ взысканий за 5 лет и как технически проверить свой сайт
mrq · 2026-05-15 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение7 мин

Охват и читатели1.1K

Обзор

Если вы веб-разработчик и хоть раз подключали шрифт "потому что он красивее, чем системный Arial" — есть ненулевая вероятность, что у вас на сайте лежит коммерческий гарнитур без лицензии. Российский бизнес три-пять лет назад массово открыл для себя, что это не безобидно: за период 2021—2025 годов через арбитражные суды по шрифтовым искам взыскано 15,3 млн ₽ (данные Коммерсанта), число исков выросло в 2,5 раза за пять лет, и тренд продолжается.

При этом проверить свой сайт на потенциально опасные шрифты — технически нетривиальная задача. Парсить CSS «как получится» через регулярки не работает: получаются ложные срабатывания на CSS-ключевые слова, на источниках вроде Яндекс.Метрики, на иконочных шрифтах. Дальше — про правовую сторону вопроса и про то, как мы написали детектор, который этим не страдает.

Кто такие «шрифтовые тролли» в РФ

Терминология не вполне корректна (это не тролли, а правообладатели, защищающие свои права), но устоялась по аналогии с фототроллингом. По публикациям в деловых СМИ выделяются три группы активных истцов:

Студия Артемия Лебедева — владеет правами на ряд популярных кириллических шрифтов (Tema, Letovo, MagistralC и др.). Иски подаются регулярно к компаниям, использующим шрифты студии без лицензии.

ParaType — старейший российский производитель шрифтов. По их публикациям, корпоративные лицензии на коммерческие гарнитуры стоят от нескольких десятков тысяч рублей; иски за неавторизованное использование — типичная составляющая бизнес-модели студии (это публичная позиция самого ParaType, не оценочное суждение).

ТайпТайп — относительно молодая словолитня, активно защищающая права на свои гарнитуры через суды. По данным СПб Ведомостей, также по данным Коммерсанта, несколько резонансных дел 2023—2024 были связаны именно с ТайпТайп.

Юридическая сторона аналогична фототроллингу: статья 1301 ГК РФ, компенсация от 10 000 до 5 000 000 рублей за каждый случай нарушения исключительного права. Доказательственная база — нотариальный скриншот сайта, скриншот из web.archive.org, либо встроенная экспертиза по CSS.

Почему обычные сайты этого не замечают

Типовой сайт на каком-нибудь Битриксе или WordPress подключает шрифты в одном из трёх режимов:

  1. Через @font-face со своими файлами — в /local/templates/.../fonts/MyriadPro.woff2. Файлы залиты в репозиторий сайта; их легко обнаружить через скан.

  2. Через CDN типа Google Fonts — <link href="https://fonts.googleapis.com/css?family=Roboto">. Бесплатно и легально (OFL/Apache 2.0).

  3. Через сторонние виджеты — Яндекс.Метрика, чаты от JivoSite, рекомендательные системы. Они тянут свои шрифты, и они нас не касаются — это не наши шрифты.

В большинстве случаев разработчик добросовестно думал, что шрифты с Google Fonts. Но часть сайтов унаследована или поддерживается фрилансерами, которые когда-то скачали платный гарнитур с пиратских ресурсов вроде fonts2u.com или bestfonts.pro, положили в шаблон и забыли. С точки зрения суда это «использование охраняемого произведения в коммерческой деятельности».

Этот сценарий — массовый. По нашей выборке (мы запустили бесплатный сканер шрифтов) — примерно у 12% обследованных сайтов обнаруживается хотя бы один коммерческий шрифт, не входящий в Google Fonts. Часть из них — действительно легальные (например, корпоративная лицензия Helvetica Neue), но без аудита это не отличить.

Как написать детектор шрифтов

Тут начинается технически интересная часть. Задача:

  • Дать пользователю сайт по URL.

  • Скачать главную + 1—2 поддиректории.

  • Извлечь только пользовательские шрифты (не виджетов, не браузерных дефолтов).

  • Классифицировать каждый: безопасный / требует внимания / опасный.

Парсинг CSS — почему регулярка по font-family не работает

Первый соблазн — найти в HTML/CSS все строки вида font-family: "..." и считать содержимое именем шрифта. Так делают многие сканеры. Проблемы:

/* реальный пример из CSS на одном из спортивных сайтов */.card { padding: 10px 0px 0px; font-family: Arial; }body { -webkit-font-smoothing: antialiased; }.hero { position: relative; font-style: italic; }

Грубая регулярка /font[^:]*:\s*([^;}]+)/ поймает в массив имён шрифтов:

  • 10px 0px 0px (это padding!)

  • antialiased (CSS-keyword для font-smoothing)

  • italic (CSS-keyword для font-style)

  • relative (содержит font-style: italic рядом, регулярка склеит)

Чтобы этого не было, нужен CSS-aware парсер. Минимальный рабочий код:

function extract_font_families(string $css): array {    $found = [];    // Сначала ищем @font-face блоки — там точно шрифты    if (preg_match_all('/@font-face\s*\{([^}]+)\}/i', $css, $blocks)) {        foreach ($blocks[1] as $block) {            if (preg_match('/font-family\s*:\s*([\'"]?)([^;\'"]+)\1/i', $block, $m)) {                $found[] = trim($m[2]);            }        }    }    // Затем в обычных правилах — ИМЕННО font-family, не *font*    // По селекторам: разделяем на declarations и проверяем строго property == font-family    if (preg_match_all('/\{([^}]+)\}/', $css, $decls)) {        foreach ($decls[1] as $block) {            foreach (explode(';', $block) as $line) {                if (!preg_match('/^\s*font-family\s*:\s*(.+)$/i', $line, $m)) continue;                foreach (explode(',', $m[1]) as $family) {                    $family = trim($family, " \t\n\r\"'");                    if ($family !== '' && !is_css_keyword($family)) $found[] = $family;                }            }        }    }    return array_unique($found);}function is_css_keyword(string $s): bool {    static $keywords = [        'inherit', 'initial', 'unset', 'revert', 'sans-serif', 'serif',        'monospace', 'cursive', 'fantasy', 'system-ui', 'ui-monospace',        'normal', 'italic', 'oblique', 'bold', 'bolder', 'lighter',        // ... ~50 ключевых слов CSS    ];    if (in_array(strtolower($s), $keywords, true)) return true;    // числа с единицами — это размеры, не шрифты    if (preg_match('/^-?\d+(\.\d+)?(px|em|rem|%|pt|cm|mm|in|vw|vh)?$/i', $s)) return true;    return false;}

Этот парсер прошёл наш регресс-набор из ~30 реальных сайтов без ложных срабатываний.

Классификация — Google Fonts vs коммерческий

Просто иметь список найденных шрифтов недостаточно — нужно сказать, безопасны они или нет. Подход:

function classify_font(string $family, ?string $sourceUrl = null): string {    $lc = strtolower(trim($family));    // 1. Браузерные дефолты — всегда safe    if (in_array($lc, ['arial', 'helvetica', 'times new roman', 'verdana', 'tahoma'])) {        return 'safe-system';    }    // 2. Иконочные — всегда safe    if (preg_match('/font[\s-]?awesome|material[\s-]?icons|bootstrap[\s-]?icons|dashicons|swiper-icons/i', $family)) {        return 'safe-iconic';    }    // 3. Google Fonts (загружаем список один раз в БД)    if (in_google_fonts($lc)) return 'safe-gfonts';    // 4. Известные коммерческие    $commercial = [        'minion pro', 'myriad pro', 'futura', 'helvetica neue',        'tema', 'letovo', 'magistralc',     // Студия Лебедева        'pt sans pro', 'pt serif pro',      // ParaType (Pro-версии платные)        'tt commons', 'tt norms',           // ТайпТайп    ];    foreach ($commercial as $c) {        if (strpos($lc, $c) !== false) return 'commercial-risk';    }    // 5. Эвристика: CamelCase с суффиксом веса — обычно коммерческий    if (preg_match('/^[A-Z][a-zA-Z]+(Bold|Italic|Light|Regular|Medium)?$/', trim($family))) {        return 'review';  // нужно глазами посмотреть    }    return 'unknown';}

Откуда грузится шрифт — критичная деталь

Шрифт Helvetica Neue в font-family: 'Helvetica Neue', Arial, sans-serif; без @font-face — это просто упоминание системного шрифта в стеке. Браузер использует его только если он установлен у пользователя. Сайт его не размещает, претензия не применима.

Тот же Helvetica Neue подключённый через @font-face со своим .woff2 — это уже размещение охраняемого произведения. Тут претензия применима.

Этот нюанс мы учитываем флагом embedded:

$result['embedded'] = !empty($result['sources']);if ($result['classification'] === 'commercial-risk' && !$result['embedded']) {    $result['classification'] = 'review';  // смягчаем    $result['note'] = 'шрифт в font-stack, но не размещён через @font-face — претензия маловероятна';}

Что делать после того, как сканер показал «опасные»

Удалить файл и убрать @font-face

Если шрифт неюзан в дизайне или его легко заменить системным — самое простое. Удаляете .woff2 из публичной директории, удаляете @font-face из CSS, удаляете все font-family: 'TheBadFont' (или ставите вместо них fallback). Сайт продолжает работать.

Важно: web.archive.org уже знает про факт размещения. Если сайт давно индексировался — нарушение зафиксировано, удаление файла не отменяет претензии за прошлый период использования. Помогает только в перспективе (новых нарушений не будет).

Купить лицензию

Корпоративные лицензии у ParaType и ТайпТайп — от десятков до сотен тысяч рублей за гарнитур. У Студии Лебедева — индивидуальные сделки. Если шрифт критически важен для бренда — это стандартный путь.

Заменить на лицензионно-чистый аналог

Большинство популярных коммерческих гарнитур имеют близкие аналоги в Google Fonts:

Коммерческий

Аналог в Google Fonts (OFL)

Helvetica Neue

Inter, IBM Plex Sans, Nunito Sans

Futura

Jost, Nunito

Minion Pro

Lora, Source Serif Pro

TT Commons

Manrope, Mulish

Myriad Pro

Source Sans Pro, Open Sans

Заменяете путь к шрифту и font-family, фронт продолжает работать без визуальных потерь — отличить читателю «Helvetica Neue» от «Inter» в большинстве сайтов невозможно.

Архитектурный вызов: сканить много сайтов параллельно

Если вы делаете публичный сервис типа «введите URL — получите аудит за 15 секунд», возникают побочные задачи:

  • Anti-DoS на свою же инфру. Сайт может содержать @import цепочки или гигантские CSS на 5 МБ — нужны лимиты на размер и таймауты.

  • Кэширование результатов на короткий TTL — если одна и та же домен-страница сканируется 10 раз в час, считать каждый раз не имеет смысла. Мы держим кэш на 14 дней с предупреждением о свежести.

  • Уважение robots.txt. Если хозяин сайта запретил роботам — наш сканер должен это уважать. Спорный момент: формально мы делаем то же, что и обычный пользователь (HTTP GET), но имеет смысл показать в User-Agent своё имя и контактную почту, чтобы хозяин мог нас отблокировать руками если что.

  • Очередь задач + worker. Один сайт ≈ 1—5 секунд, при нескольких параллельных запросах нужен FIFO с воркером (мы используем PostgreSQL FOR UPDATE SKIP LOCKED для блокировки задач без явного очереднего сервиса).

Готовое решение лежит в open: исходный сканер imgchanger.org/ru/fonts/ (можно проверить свой сайт прямо там).

Юридические нюансы, в которых мы не разбираемся (поправят юристы)

  • Срок исковой давности по 1301 ГК РФ — 3 года, но истец может утверждать, что узнал о нарушении недавно. Это вопрос практики.

  • Размер компенсации — по выбору суда от 10 000 до 5 000 000 ₽, в большинстве дел встаёт в диапазон 50 000 — 300 000 ₽ за гарнитур.

  • Можно ли «договориться без суда» — да, и часто это дешевле. ParaType публично декларирует готовность обсуждать мировые.

  • Что с шрифтами «купленными не нами, а подрядчиком» — формально ответственность за нарушение на стороне владельца сайта, не подрядчика, если иное не следует из договора. Но регресс к подрядчику возможен.

Заключение

  • В РФ массово идут шрифтовые иски, 15,3 млн ₽ взысканий за 5 лет (по данным Коммерсанта).

  • Аудит сайта — задача автоматизируемая, но грубые регулярки дают много ложных срабатываний; нужен CSS-aware парсер + база Google Fonts + правила про embedded/non-embedded.

  • Найти опасный шрифт — это полдела. Дальше его нужно или удалить (помогает в перспективе), или купить лицензию, или заменить на OFL-аналог.

  • Свой сайт можно проверить за 15 секунд на imgchanger.org/ru/fonts/ — там же реализованы все обсуждаемые в статье техники.

Открытые вопросы, которые мы оставляем за скобками: что делать с пиратскими шрифтами в принтабельных PDF на сайте, как оценивать риск шрифтов в .docx-вложениях, как поступать с шрифтами в иконочных SVG. Если интересно — поднимем во второй статье.