|
Professor Seleznov
|
Если вы веб-разработчик и хоть раз подключали шрифт "потому что он красивее, чем системный 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. Если интересно — поднимем во второй статье.-Источник
|