Шрифтовые иски в РФ: 15,3 млн ₽ взысканий за 5 лет и как технически проверить свой сайт

от автора

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

ссылка на оригинал статьи https://habr.com/ru/articles/1035362/