Безопасность

Наша модель безопасности в одном предложении: на сервере нечего атаковать. Всё нижесказанное можно проверить через DevTools вашего браузера.

Архитектура

Генератор, это статическое одностраничное приложение, раздаваемое с Cloudflare Pages: нет учётных записей пользователей, аутентификации и кода бэкенда где-либо в процессе генерации. Каждая операция генерации QR, кодирования, сканирования и рендеринга выполняется полностью в вашем браузере. Один небольшой серверлесс-эндпоинт существует рядом с ним и указан здесь открыто, а не спрятан: /api/contact (форма обратной связи, которая сохраняет то, что вы отправляете, в Cloudflare D1 и отправляет это нам по почте). Он не вызывается, пока вы создаёте QR-код; проверка безопасности URL, это отдельный продукт на check.qr.abundera.ai. Проверить безопасность QR-кода

Модель угроз

Поскольку генератор не собирает, не хранит и не передаёт никаких пользовательских данных (два эндпоинта выше обрабатывают только то, что вы явно им отправляете), наиболее распространённые угрозы для веб-приложений, кража учётных данных, утечка базы данных, перехват сессий, серверные инъекции, к нему неприменимы. Оставшаяся поверхность атаки, это пакет статических ресурсов (HTML, CSS, JavaScript), раздаваемый с нашего источника. При проектировании мы исходим из следующего:

Content Security Policy, по директивам

Политика ниже считывается из развёрнутого файла _headers при сборке этой страницы, поэтому она не может разойтись с тем, что отдаёт edge-сервер. Проверьте её в заголовках ответа любого запроса.

Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://abundera.ai 'wasm-unsafe-eval' https://challenges.cloudflare.com;
  worker-src 'self' blob:;
  style-src 'self' 'unsafe-inline' https://abundera.ai;
  font-src 'self';
  img-src 'self' data: blob: https:;
  connect-src 'self' https: https://challenges.cloudflare.com;
  frame-src 'self' https://challenges.cloudflare.com;
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self'

Что разрешает каждая директива и где она идёт на компромисс:

Чего CSP не может

CSP ограничивает, откуда браузер загружает код. Он не проверяет, что делает уже загруженный код. Если бы наш origin оказался скомпрометирован, первый пункт в модели угроз, скрипт злоумышленника выполнялся бы с теми же правами, что и наш, включая допуски connect-src и img-src выше. Наша защита от этого лежит выше по цепочке, чем CSP: деплои идут через один аккаунт Cloudflare со скоуп-токенами, имена файлов ресурсов хешируются по содержимому, поэтому подменённый файл меняет каждый URL, который на него ссылается, а сервис-воркер кэширует только GET-ответы того же источника. Манифест описывает сайт таким, каким он поставляется. Это не утверждение, что никакая веб-страница никогда не сможет куда-либо отправить данные, и мы предпочитаем, чтобы вы держали нас в рамках именно этого более узкого, проверяемого утверждения.

К /bio/* (ослабленный img-src для аватаров от пользователей) и /embed/* (ослабленный frame-ancestors для намеренного встраивания) применяются отдельные политики CSP. Обе задокументированы в site/_headers.

Заголовки транспорта и фреймирования

Сервис-воркер

Наш сервис-воркер (site/sw.js) кэширует только ресурсы из того же источника. Обработчик fetch явно отклоняет кросс-доменные запросы и методы, отличные от GET, логику можно прочитать в /sw.js (исходник поставляется достаточно неминифицированным, чтобы его можно было проследить). Запись в кэш обёрнута в event.waitUntil(), поэтому она не может быть прервана в процессе навигации.

Санитизация входных данных

Каждый путь рендеринга, принимающий пользовательский ввод, обрабатывает его как ненадёжный текст:

Загрузка изображений с внешних ресурсов

Когда пользователь вставляет URL вида https: в качестве фотографии vCard или логотипа, браузер загружает его с учётом CORS и списка разрешений img-src нашего CSP. Изображение отрисовывается на canvas. Оно никогда не становится живым DOM, не выполняется как код и не достигает нашего источника, запрос идёт от браузера к удалённому изображению, а результат отображается на стороне клиента. Злоумышленник, контролирующий URL удалённого изображения, может отследить факт загрузки URL (строка в логе собственного сервера), но не способен извлечь что-либо с нашей страницы.

Subresource Integrity (SRI)

Весь JavaScript и CSS, который мы поставляем, является одноисточниковым. Мы не загружаем сторонние скрипты или таблицы стилей, поэтому SRI-хэши не применимы. Если мы когда-либо загрузим сторонний ресурс, мы добавим к нему атрибут SRI integrity и задокументируем процесс обновления хэша на этой странице.

Сообщение об уязвимости

Если вы обнаружили проблему безопасности, затрагивающую Abundera QR, в нашем коде, развёртывании или используемых зависимостях, пожалуйста, сообщите об этом конфиденциально по адресу security@abundera.ai. Наша цель, провести оценку в течение 72 часов. Вы также можете связаться с нами через контактные данные в файле /.well-known/security.txt.

Программы вознаграждений пока нет

В настоящее время мы не предлагаем денежных вознаграждений, но каждый подтверждённый действительный отчёт получает упоминание в журнале изменений и нашу публичную благодарность.

Проверьте всё вышесказанное

Каждое утверждение на этой странице можно проверить через DevTools браузера, не доверяя нам на слово:

Контакты

Сообщения об уязвимостях: security@abundera.ai

Последнее обновление: 2026-09-03. Следующий пересмотр: 2026-12-03.