В меню кафе на столе наклеен QR-код. Навёл камеру - в адресной строке домен сервиса коротких ссылок, а не кафе. Куда код ведёт на самом деле, из картинки не следует.

Про QR-коды принято думать как про картинку с зашитой ссылкой: отсканировал, увидел адрес, решил, идти или нет.

Так работают только статические коды. Большинство тех, что вы видите на листовках, в меню и на квитанциях, - динамические: в них зашит адрес сервиса-посредника, а тот перенаправляет дальше. Куда именно - решается в момент сканирования, и решение может зависеть от вашего устройства, страны, времени суток и от того, сканировали вы этот код раньше или нет.

Как устроен динамический код

В статическом коде лежит целевой адрес - изменить его нельзя, не перепечатав картинку.

В динамическом лежит короткая ссылка вида qr-service.example/a1b2c3. При сканировании вы попадаете на сервис, он записывает событие и отвечает перенаправлением на текущий целевой адрес. Владелец кода меняет цель в личном кабинете, картинка при этом остаётся прежней.

Сделано это ради удобства: напечатали тираж, потом поменяли посадочную страницу. Но из той же механики следуют три особенности, о которых пользователь обычно не думает.

Цель меняется после печати. Код на листовке год назад вёл на сайт кафе, сегодня ведёт куда угодно - например, если домен или аккаунт сервиса сменил владельца.

Ответ зависит от того, кто сканирует. Сервис получает модель устройства, язык, адрес и страну и может отвечать разным людям по-разному. Это штатная функция для маркетинга - и одновременно способ показать проверяющему безобидную страницу, а остальным другую.

Каждое сканирование фиксируется. Время, устройство, приблизительное местоположение. Для владельца кода это статистика, для вас - след, о котором вы не договаривались.

Что можно проверить, а что нельзя

Хорошая новость: телефоны давно показывают адрес перед переходом. Плохая: показывают они адрес посредника, из которого о цели не понять ничего.

Развернуть цепочку можно, если очень надо, - но делать это стоит не с рабочего компьютера, потому что запрос будет засчитан как сканирование:

curl -sL -o /dev/null -w '%{url_effective}\n' 'https://qr-service.example/a1b2c3'

Команда покажет конечный адрес, куда ведёт цепочка перенаправлений, и выбросит тело ответа. Запрос идёт методом GET намеренно: на HEAD часть редиректоров отвечает иначе или не перенаправляет вовсе, и конечный адрес получается не тот.

Только помните: сервис, отвечающий по-разному разным клиентам, вашему curl тоже может ответить не то, что ответит телефону.

Где на этом теряют деньги

Наклейки поверх настоящих кодов. Самый простой и самый частый вариант: на квитанцию, парковочный автомат или рекламный щит клеится своя наклейка. Никакой техники, только клей. Поэтому в местах, где по коду платят, стоит смотреть, не наклеено ли что-то поверх, - край наклейки обычно заметен, в том числе на ощупь.

Коды в письмах и документах. Приём обходит проверку ссылок: почтовый фильтр получает картинку, а не адрес. Человек сканирует телефоном - то есть переходит уже с личного устройства, где нет корпоративной защиты.

Оплата по коду. Здесь работает простое правило: сумма и получатель должны быть видны в приложении банка до подтверждения. Если после сканирования открылась веб-страница с формой карты, это ещё не мошенничество: оплата по ссылке через эквайринг так и выглядит. Но это уже не платёж по QR, а обычная форма на сайте, и относиться к ней надо соответственно - сверять домен платёжного шлюза, прежде чем вводить номер.

Практические правила

Смотреть на адрес, который показывает камера, до перехода. Если это короткая ссылка - понимать, что о цели вы ничего не знаете.

Не сканировать коды из писем: если отправитель хочет что-то показать, у него есть обычная ссылка, которую проверит почтовый фильтр.

При оплате сверять сумму и получателя в приложении банка, а не на странице.

И на физических носителях - обращать внимание на наклейки. Это выглядит паранойей ровно до первого случая, когда наклейка действительно окажется чужой.