Перейти к содержимому
Tutorial

Проверьте взломанные электронные письма при регистрации, не запуская HaveIBeenPwned самостоятельно

| 6 min read

Перехватите скомпрометированные учетные данные, прежде чем сохранять их. Один вызов API, обработчик маршрута Next.js и валидатор формы React Hook, который добавляет 40 мс к задержке регистрации.

Login form on a screen representing signup flow and breach checks
Photo by Markus Spiske on Unsplash

Возвращающийся пользователь вводит свой любимый пароль в вашу регистрационную форму. Этот пароль утек в дамп AT&T в 2024 году, взлом 23andMe в 2023 году и извлечение хранилища LastPass в 2022 году. Вы сохраняете хеш, поздравляете себя с bcrypt, а три недели спустя бот, заполняющий учетные данные, заходит в учетную запись с резидентного прокси в Бразилии.

Ремонт стоит недорого. Один вызов API при регистрации сообщает вам, отображается ли электронное письмо в списках известных нарушений. Используйте этот сигнал, чтобы принудительно выполнить MFA, потребовать более надежный пароль или поместить регистрацию в очередь проверки. В этом посте показана конечная точка, обработчик маршрута Next.js и валидатор формы React Hook, который увеличивает задержку регистрации примерно на 40 мс.

Почему проверка на нарушение происходит при регистрации, а не позже

Подстановка учетных данных работает, потому что 65% пользователей повторно используют пароли на разных сайтах (Google/Harris, 2019, повторено в опросе Bitwarden 2023 года). Электронное письмо, связанное с 14 предыдущими нарушениями, не является случайной выборкой из Интернета; это пользователь, который передал один и тот же пароль 14 различным поставщикам, у которых есть утечка информации. Предельная вероятность того, что они ввели одно и то же в вашу форму, высока.

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

Один вызов API, два сигнала

POST /v1/breach/check принимает либо электронную почту, либо пароль. Вот звонок по электронной почте.

И пример ответа на адрес, который указан в трех корпусах.

Две вещи, на которые стоит обратить внимание. breach_count и breaches массив дает вам имена наборов данных, даты и общее количество записей; они не возвращают раскрытый пароль, полную утекшую запись или любую личную информацию, кроме той, которую вы отправили. password_exposed заполняется только тогда, когда вы передаете password поле в теле запроса. Для регистрации достаточно одного электронного письма, чтобы оценить уровень риска.

API k-anonymity от HaveIBeenPwned бесплатен для личного использования и отлично подходит для поиска префиксов паролей. В промышленном масштабе вы платите 3,50 доллара США в месяц за ключ и поддерживаете обработку префикса SHA-1, а также ограничения скорости на стороне клиента. Конечная точка botoi оборачивает эту инфраструктуру и добавляет пограничное кэширование, унифицированную аутентификацию с остальной частью API и единый счет.

Обработчик маршрута Next.js

Поместите вызов в собственный маршрут, чтобы ключ API оставался на сервере. Подтвердите ввод с помощью Zod, добавьте тайм-аут AbortController в 300 мс и не открывайте его при ошибках восходящего потока, чтобы медленная проверка на наличие нарушений никогда не блокировала реальную регистрацию.

Несколько вариантов дизайна, которые стоит назвать. Тайм-аут небольшой (300 мс), поскольку реакция P95 составляет 120 мс, а все, что медленнее, является переходным; ветвь, открытая при сбое, возвращается risk: 'low' поэтому ненадежная третья сторона не сможет удалить вашу регистрационную форму. tier() Функция — единственное место, где живет политика риска, поэтому ее нужно перенастроить позже.

Валидатор формы React Hook на стороне клиента

Отказ на 500 мс, чтобы вы не запускали запрос при каждом нажатии клавиши. Не блокируйте кнопку отправки результата; вместо этого покажите предупреждение и предварительно переключите MFA. Предупреждения конвертируются; жесткие блоки теряют пользователя.

Подключите хук к компоненту React Hook Form. watch вызов передает электронное письмо в перехватчик, и результат предварительно проверяет поле MFA на наличие взломанных адресов.

Что делать с результатом

Переведите количество нарушений в политику. Начните с этой таблицы и настройте ее, как только у вас будет две недели регистрации после подсчета очков.

Количество нарушений Действие UX Почему
0 Продолжить Без изменений Никаких публичных доказательств предшествующего компромисса; путь по умолчанию.
1-3 Подскажите МИД Предварительно установите флажок MFA, покажите мягкое предупреждение Обычно один повторно используемый пароль при каждом взломе; подтолкнуть пользователя к защите новой учетной записи.
4-10 Принудительное MFA + надежный пароль Требовать регистрацию TOTP перед первым входом в систему, минимум 14 символов. Повторное воздействие предполагает, что электронное письмо есть во всех основных списках учетных данных; слабый пароль здесь — это захват, который ждет своего часа.
10+ Мягкий блок с трением Добавьте капчу или отправьте на проверку вручную Это электронное письмо фактически является общедоступным. Увеличьте стоимость злоумышленника, прежде чем создавать на нем учетную запись.

Добавьте к этому еще две проверки менее чем за 120 мс.

Только проверка на взлом позволяет выявить риск повторного использования пароля. Соедините его с /v1/disposable-email/check для пометки доменов tempmail и /v1/vpn-detect чтобы пометить IP-адреса центра обработки данных или источника Tor, и у вас есть система показателей с тремя сигналами, которая работает параллельно менее 120 мс на P95. Полный шаблон оценки (веса, пороговые значения, журналирование аудита) находится в Остановите мошенничество при регистрации с помощью трех проверок API.

Получите бесплатный ключ API по адресу botoi.com/api/signup. Уровень бесплатного пользования охватывает 1000 проверок нарушений в день (5 запросов в минуту), чего достаточно для небольшого SaaS или для воспроизведения ваших последних 30 дней регистраций через конечную точку и калибровки вышеуказанных уровней по данным об оттоке и злоупотреблениях.

Полная ссылка на конечную точку: API проверки на утечку.

FAQ

Это приводит к утечке адресов электронной почты в botoi?
Электронное письмо попадает в API через TLS и используется только для вычисления совпадения с нарушением. Тела запросов не сохраняются в журналах доступа; только метод, путь, статус и задержка сохраняются в течение 30 дней. Полный текст инструкции по обработке данных см. в документации API.
Какова типичная задержка?
Среднее время ответа составляет 40 мс для пограничного узла Cloudflare Workers и 120 мс для 95-го процентиля. Обработчик в этом посте устанавливает тайм-аут AbortController 300 мс, поэтому медленный вызов не может заблокировать вашу форму регистрации.
Насколько свеж набор данных о нарушениях?
Набор данных синхронизируется еженедельно из общедоступных дампов (нарушения, отслеживаемые с помощью HIBP, списки вставки учетных данных и коллекции № 1–5). Новые корпорации появляются в течение 7 дней после публичного раскрытия.
Могу ли я проверить пароли напрямую?
Да. ОТПРАВЬТЕ префикс SHA-1 (первые 5 шестнадцатеричных символов) или пароль в виде открытого текста в ту же конечную точку. Форма префикса более безопасна для вызывающих программ на стороне клиента, поскольку полный хэш никогда не покидает браузер. Используйте открытый текст только с вашего сервера.
Соответствует ли это GDPR?
Проверка на утечку является мерой безопасности в соответствии со статьей 32 GDPR (безопасность обработки). Задокументируйте проверку в своих отчетах о деятельности по обработке данных, укажите botoi в качестве обработчика в своем DPA и отметьте законное основание (законный интерес в предотвращении захвата учетных записей).

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.