Все говорят «не сканируйте подозрительные QR», но не объясняют главного: подозрительный от нормального отличить невозможно в принципе. Это же просто квадрат из шума.
Решил разобраться руками: сгенерировал коды, поломал их, декодировал обратно.
Опыт 1. Два кода, один символ разницы
Взял два адреса, отличающихся одним знаком — во втором вместо буквы «o» стоит ноль:
Матрица у обоих одинаковая, 29×29. Различаются они в 179 модулях из 841 — это 21% картинки.
Казалось бы, пятая часть заметна. Но любой QR — чёрно-белая крошка, отличить один узор шума от другого глазом невозможно. Оба кода честно декодировались каждый в свой адрес.
Разница между настоящим кодом и подделкой физически есть, но человеку она недоступна. Совета «внимательно посмотрите на код» не существует.
Опыт 2. Сколько можно заклеить
Сначала пара слов про устройство кода, иначе дальше будет непонятно.
При печати QR выбирают уровень коррекции ошибок — сколько запасных данных положить внутрь на случай царапин и грязи. Уровней четыре: L, M, Q и H, от минимального запаса к максимальному. Чем выше уровень, тем больше повреждений код переживёт и тем крупнее сам рисунок.
Пример: в кодах с логотипом посередине всегда стоит H — логотип закрывает часть данных, и без запаса такой код не читался бы.
Уровень выбирает тот, кто печатает. Со стороны его не определить.
Я сделал по коду на каждом уровне и заклеивал центр белым квадратом, увеличивая площадь:
Уровень L
заклеено 5% — читается
заклеено 10% — нет
Уровень M
заклеено 5% — читается
заклеено 10% — нет
Уровень Q
заклеено 10% — читается
заклеено 15% — нет
Уровень H
заклеено 15% — ЧИТАЕТСЯ
заклеено 20% — нет
На максимальном уровне код пережил дыру в 15% площади — квадрат 14×14 модулей из 37×37 прямо посередине — и выдал адрес, будто ничего не произошло.
Оговорюсь: в спецификации для H заявлено до 30%, но там речь про мелкие повреждения по всему полю. Сплошной кусок переносится хуже, мои 15% это и показали.
А теперь главное, ради чего опыт затевался.
Я начинал с гипотезы, что именно избыточность делает возможной уличную подмену: мошенник заклеивает часть кода и перенаправляет его на себя. Гипотеза неверна. Заклеенный кусок даёт одно из двух: код либо перестаёт читаться, либо продолжает вести на настоящий адрес. Данные внутри так не перепишешь.
Реальная схема грубее: сверху лепят целый свой код, и коррекция ошибок тут ни при чём.
Зато опыт показал другое, и это неприятнее. Телефон не отличает целый код от покалеченного: потёртый, залепленный, с логотипом поверх — он молча читает и открывает ссылку.
Значит, если код подменили или испортили, сигнала вы не получите. Заметить можно только глазами, посмотрев на сам носитель. Чего мы, конечно, не делаем.
Опыт 3. Что вообще влезает в QR
Все думают, что QR — это всегда ссылка. Проверил, что ещё туда влезает:
Wi-Fi с автоподключением WIFI:T:WPA;S:Cafe_Guest;P:12345678;;
Готовый звонок tel:+74951234567
Готовая SMS с текстом SMSTO:900:BALANS
Открытие приложения intent://pay/#Intent;scheme=bank;end
Короткая ссылка-редирект clck.ru/3Xy7Qz
Всё декодировалось без искажений. Код на столике кафе может не открыть сайт, а подключить телефон к чужой точке доступа, подставить номер в звонилку или открыть банковское приложение на экране перевода.
Последняя строка — отдельная беда: сокращённая ссылка не показывает конечный адрес даже в предпросмотре сканера.
Разборы таких схем и статьи по кибербезопасности — в канале.
Не подглядывая вниз — что опаснее?
А. QR на бумажном объявлении у подъезда
В. QR-наклейка на парковочном автомате
Г. QR на ламинированной табличке в кафе
Ответ: А и В. Бумажку и наклейку заменит кто угодно за пять секунд, не оставив следов. Чек печатается в момент покупки, ламинат требует возни — хотя поверх него наклейка ложится прекрасно.
Принцип: чем легче физически заменить носитель, тем меньше коду доверия.
Смотрите адрес в предпросмотре сканера до перехода — это единственный момент, когда ссылку видно.
Проверяйте край наклейки: приподнятый уголок, свежий клей, код криво относительно рамки — признаки накладки.
Для оплаты парковки, ЖКХ и штрафов не используйте QR со стенда — откройте приложение сами.
Показал сокращённую ссылку — не переходите. Легальные сервисы прячут адрес редко, мошенники — всегда.
А теперь в комментарии: сканировали QR на улице не глядя? Я — да, за парковку, и после эксперимента мне слегка не по себе.