Если вы веб-разработчик и хоть раз подключали шрифт «потому что он красивее, чем системный 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 подключает шрифты в одном из трёх режимов:
-
Через
@font-faceсо своими файлами — в/local/templates/.../fonts/MyriadPro.woff2. Файлы залиты в репозиторий сайта; их легко обнаружить через скан. -
Через CDN типа Google Fonts —
<link href="https://fonts.googleapis.com/css?family=Roboto">. Бесплатно и легально (OFL/Apache 2.0). -
Через сторонние виджеты — Яндекс.Метрика, чаты от 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. Если интересно — поднимем во второй статье.
ссылка на оригинал статьи https://habr.com/ru/articles/1035362/