Безопасность QR-кодов: риски динамических QR и ловушки сокращателей ссылок
Резюме (TL;DR)
Недавно в кафе я отсканировал QR из меню и попал в незнакомый сокращатель ql.st. Перевернув табличку, я увидел, что поверх оригинального QR была наклеена новая наклейка. Владелец сказал, что уже несколько недель не замечал подмены. Сложные уязвимости «атакующие сам QR» встречаются редко. Реальные инциденты почти всегда начинаются вот так, с одной наклейки.
QR-код — это не «просто картинка», а формат визуального кодирования URL или текста. У самого QR нет никаких защитных механизмов; почти всю безопасность определяют URL назначения, куда вас уводит скан, и способ, которым QR был создан. В статическом QR URL лежит прямо в коде, и после печати содержимое изменить нельзя. Динамический QR позволяет менять содержимое, но опирается на сервер-редиректор: если сервис закроется или сменит владельца, результат скана может вести уже на совсем другую страницу. Короткие ссылки страдают тем же: срок жизни, риск захвата и трекинг — всё это делает их плохим выбором для публичной печати, долгоживущих носителей и оффлайн-материалов. Самый безопасный дефолт — статический QR со статическим URL на вашем собственном домене. Если задачи кампании требуют трекинга, используйте динамический QR у доверенного провайдера, но сразу продумайте план по перенаправлению после окончания кампании.
Предыстория и концепции
Официальная спецификация QR — ISO/IEC 18004. У кодов есть версии с 1 по 40: чем выше версия, тем больше модулей (ячеек сетки) и, соответственно, данных. Каждый QR несёт ещё и данные избыточного кодирования Рида — Соломона для коррекции ошибок. Уровней четыре:
- L: восстановление примерно 7 % повреждённых данных
- M: примерно 15 %
- Q: примерно 25 %
- H: примерно 30 %
Чем выше уровень коррекции, тем лучше код переживает грязь или перекрытие логотипом, но увеличивается плотность модулей, и при маленькой печати код, наоборот, сканируется хуже. На визитках и постерах по умолчанию берут M, а Q/H рассматривают, если планируется логотип в центре.
В статическом QR URL буквально запечён в модулях, поэтому результат скана постоянен. В динамическом хранится «короткий URL редиректора», а провайдер подменяет целевой адрес на своей стороне. Удобно, но именно эта гибкость и становится источником долгосрочных рисков.
Сравнение и данные
| Критерий | Статический QR | Динамический QR |
|---|---|---|
| Какой URL закодирован | Итоговый адрес назначения | Короткий адрес редиректора |
| Трекинг сканов | По умолчанию нет | Базовая функция |
| Риск устаревания | Нет, пока вы владеете доменом | Зависит от тарифа, контракта, судьбы провайдера |
| Зависимость от третьей стороны | Нет | Есть (редиректор) |
| Поверхность для фишинга | Нужно проверять только целевой URL | Захват редиректора или смена владельца может увести пользователя куда угодно |
| Возможность редактирования | Нет (нужна перепечатка) | Есть (гибко) |
«Короткий URL выглядит аккуратно» — это плюс, который легко оборачивается минусом: человек не может проверить адрес глазами.
Практические сценарии
Сценарий 1 — офлайн-печать: визитки и постеры. Однажды я достал визитку 2019 года и попробовал её QR: записанная там короткая ссылка через bit.ly уже отдавала 404. Скорее всего, истёк контракт с сервисом трекинга. Самый долгоживущий вариант — запекать в статический QR канонический URL на вашем собственном домене. При маленьком формате сознательно понижайте уровень коррекции и минимизируйте число модулей — так распознаваемость при сканировании выше.
Сценарий 2 — измерение эффективности маркетинговой кампании. Один стартап повесил динамический QR на стенде выставки, а через три месяца сервис перевёл часть функций на платный тариф, и код стал вести на страницу «тариф истёк». Я стараюсь использовать связку «короткий путь на своём домене + UTM»: что-то вроде yourdomain.com/go/summer-2026. Пока домен у вас, у кода нет срока годности.
Сценарий 3 — целостность документов и верификация. Вместо URL в QR можно класть хеш документа или подписанные параметры URL (?d=abc123&sig=...), чтобы после сканирования можно было сверить содержимое с оригиналом. В одном проекте с сертификатами я запекал первые 16 символов SHA-256 и HMAC-подпись; в итоге версия QR выросла до 10+, и пришлось заново подбирать размер печати. Для договоров, сертификатов и маркировки продукции такой подход помогает ловить подделки.
Распространённые заблуждения
«QR можно взломать как таковой». QR — всего лишь формат кодирования данных, и атак на сам код практически не бывает. Реальные риски — это либо фишинговый/вредоносный URL внутри QR, либо физическая подмена, когда поверх оригинального кода наклеивают другую наклейку. В публичных местах привыкайте хотя бы визуально проверять, нет ли поверх QR свежей этикетки.
«Короткая ссылка аккуратнее, значит лучше». Визуально — да, но пользователь не может её проверить. А если сокращатель остановят, продадут или взломают, результат сканирования на всех напечатанных материалах изменится. Чем дольше живёт носитель, тем безопаснее длинный URL на собственном домене.
«У коррекции ошибок уровень H всегда лучший». Уровень H действительно удобен для логотипов, но увеличивает количество модулей, и на маленькой печати распознаваемость падает. На площади визитки обычный дефолт — M.
«По QR сразу видно, куда он ведёт». Камера iOS 17–18 показывает баннер с URL, но часть OEM-камер на Android и сторонние сканеры открывают браузер буквально в один тап. Фишинг под видом «QR входа в публичный Wi-Fi» как раз целится в этот автоматический переход. Безопаснее выключить автооткрытие и приучать себя сначала смотреть домен.
Чек-лист
- Каков срок жизни?
- Годы и дольше — статический QR + URL на собственном домене.
- Короткая кампания — динамический QR или UTM-метки.
- Нужен ли обязательно трекинг?
- Нет — достаточно статического QR.
- Да — динамический QR у доверенного провайдера; обязательно иметь план редиректа после окончания кампании.
- Какой размер печати?
- Очень маленький — уменьшайте объём данных и держите коррекцию на уровне M.
- Средний и большой — Q/H, если нужен логотип.
- Размещается ли код в публичном месте?
- Да — регулярно проверяйте, не появились ли сверху посторонние наклейки.
- Безопасен ли целевой URL?
- HTTPS, собственный домен, актуальность — всё проверить.
- Где создаёте QR?
- По возможности выбирайте оффлайн или браузерную генерацию, чтобы URL не попадал в логи внешних серверов.
Связанный инструмент
Генератор QR-кодов Patrache Studio работает прямо в браузере, так что введённый URL не уходит на внешние серверы. Если изображение с QR-кодом будет опубликовано в вебе, сверьтесь с критериями выбора формата в полном руководстве по сжатию изображений. А если QR нужно вставить в документ и передать вместе с ним, используйте подход из Безопасности PDF в браузере — так вы сохраните одинаковую границу приватности на всём пути.
Источники
- ISO/IEC 18004:2015, «QR Code bar code symbology specification» — официальное название стандарта (распространяется платно).
- UK NCSC, «Guidance on QR code use» — https://www.ncsc.gov.uk/guidance/qr-codes
- Anti-Phishing Working Group, общие материалы о фишинге — https://www.phishing.org/phishing-examples
- MDN, структура и валидация URL — https://developer.mozilla.org/en-US/docs/Web/API/URL