Безопасность платёжного API: списки разрешённых IP-адресов, API-ключи и вебхуки

Безопасность платёжного API: списки разрешённых IP-адресов, API-ключи и вебхуки

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

Это руководство адресовано руководителям инженерных команд и руководителям платёжных направлений в PSP, EMI, банках и у мерчантов, которые подключают крипто-платёжный API с расчётами в евро. В нём показано, как ограничить ключ по IP-адресу и диапазону CIDR, где должен храниться ключ, как проверять вебхуки и какие контроли нужны вокруг выплат. Примеры используют API и панель ItisPay (демонстрационные данные).

Видео-резюме, 112 секунд, на английском.

Ключевые моменты

Коротко

  • API-ключ — это учётные данные типа bearer: кто их предъявил, тот и авторизован. По данным GitGuardian, в публичные коммиты GitHub в 2025 году попало 28,65 млн новых секретов, жёстко прописанных в коде, поэтому планируйте не только то, как сохранить ключ, но и то, что он может утечь.
  • IP-список разрешённых адресов делает утёкший ключ бесполезным за пределами вашей сети. Укажите наименьшие диапазоны IPv4 или IPv6, которые покрывают ваши реальные исходящие адреса; пустой список разрешает любой адрес.
  • Вебхук — это уведомление, а не доказательство. Перепроверьте счёт по его ID вашим ключом, прежде чем отправлять товар или зачислять средства на счёт.
  • Для выплат нужны человеческие контроли на вашей стороне: двухэтапный вход, сохранённые IBAN и кошельки получателей и второй согласующий для сумм выше заданного порога.

Почему утечка платёжного API-ключа так опасна?#

Утечка платёжного API-ключа опасна, потому что ключ — это вся идентичность вашей интеграции. API ItisPay, как и большинство платёжных API, аутентифицирует каждый запрос одним заголовком, Api-key, и одна и та же аутентификация открывает доступ к счетам, выплатам на IBAN или кошелёк и выводам криптовалюты на внешний адрес. Поэтому в документации требуется, чтобы ключ «не раскрывался в клиентском коде или публичных репозиториях».

На практике ключи утекают через обычные места: код, логи и чаты. По данным GitGuardian's State of Secrets Sprawl 2026 (март 2026 года), в публичные коммиты GitHub в 2025 году попало 28,65 млн новых секретов, жёстко прописанных в коде, что на 34 % больше, чем годом ранее. Когда GitGuardian повторно проверила секреты, утёкшие в 2022 году, более 64 % из них в январе 2026 года были всё ещё действительны. Команды публикуют ключи и потом забывают их заменить.

В списке OWASP API Security Top 10 (2023) «Broken Authentication» занимает второе место, и там предупреждается, что «механизм аутентификации — лёгкая мишень для атакующих, поскольку доступен всем». В отчёте Verizon 2025 Data Breach Investigations Report злоупотребление учётными данными названо самым частым первичным вектором атаки — 22 %. Одна секретная строка — слабая защита, поэтому остальная часть руководства добавляет слои, которые сохраняют силу даже после того, как строка попала наружу.

Как IP-список разрешённых адресов защищает API-ключ?#

Список разрешённых IP-адресов, который иногда называют IP-вайтлистом, защищает ключ, привязывая его не только к строке, но и к местам. API принимает ключ, только если запрос пришёл с адреса из вашего списка; копия ключа на ноутбуке разработчика, в логе CI или на paste-сайте не работает.

В панели ItisPay эта настройка находится в разделе Projects, затем Settings, затем Security, в поле API Allowed IPs. Поле принимает список отдельных адресов и блоков CIDR, разделённых запятыми. Подсказка в поле гласит: «Оставьте пустым, чтобы разрешить все IP-адреса. Поддерживаются IPv4 и IPv6.» Тот же список можно задать при создании проекта через API, в поле api_allowed_ips; некорректная запись, например 256.256.256.256, отклоняется с ошибкой валидации, а не сохраняется.

Настройки проекта ItisPay: поле API Allowed IPs с одним адресом IPv4 и одним диапазоном /24 (демонстрационные данные)

Пустое значение по умолчанию важно. Новый проект принимает ключ откуда угодно, пока кто-нибудь не заполнит поле, поэтому внесите этот шаг в список задач перед запуском, а не в список того, что можно поправить позже. Демонстрационные значения на скриншоте, 203.0.113.10 и 198.51.100.0/24, взяты из диапазонов, которые RFC 5737 резервирует для документации; ваш список будет содержать ваши собственные публичные адреса. У каждого проекта свой 64-символьный ключ и свой список, поэтому продакшн может быть закреплён за двумя-тремя серверами, а тестовый проект — принимать более широкий набор.

Как записывать диапазоны CIDR для IPv4 и IPv6?#

Записывайте наименьший диапазон, который покрывает каждый адрес, реально используемый вашими серверами для обращения к API. Большинство проблем со списками возникает из-за слишком широкого диапазона или из-за забытого исходящего маршрута.

Как читать префикс#

Блок CIDR — это адрес, за которым следуют косая черта и длина префикса. RFC 4632 определяет длину префикса как число значащих битов: 192.168.99.0/24 фиксирует первые 24 бита и оставляет свободными 8, что даёт 256 адресов. Каждый бит, который вы отнимаете от префикса, удваивает блок. /32 — это один адрес IPv4, /29 — 8, /24 — 256, а /16 — 65 536.

IPv6 работает так же, но с 128 битами. /128 — один адрес. RFC 4291 задаёт для большинства адресов IPv6 интерфейсную часть в 64 бита, поэтому сеть сервера обычно представляет собой /64, а хост может менять адрес внутри неё, например когда операционная система генерирует временные адреса. Если IPv6-адрес вашего хоста меняется, а этот /64 принадлежит только вам, укажите /64, а не отдельный /128. Диапазон документации для примеров IPv6 — 2001:db8::/32 (RFC 3849), поэтому никогда не копируйте его в реальный список разрешённых адресов.

Как найти реальный исходящий адрес#

Важен тот адрес, который видит API, а не тот, который сам сервер сообщает о себе. За облачным NAT-шлюзом или корпоративным файрволом многие машины делят один или два публичных адреса. Serverless-функции часто выходят из общего пула, если вы не направляете их через фиксированный выход. Проверьте из каждого окружения, обратившись к сервису «узнать мой IP» или прочитав исходящий адрес в логах файрвола, а затем внесите в список именно его.

КонфигурацияЧто добавить в списокВердикт
Один сервер со статическим публичным IPv4-адресомЭтот адрес в виде /32 или без маскиРаботает
Несколько серверов за облачным NAT-шлюзомПубличные адреса NAT-шлюзаРаботает
Хост с IPv6 и меняющимися адресами/64 хоста, если его не использует никто другойЗависит
Офисная сеть для ручного тестированияФиксированный адрес офиса, если провайдер его гарантируетЗависит
Serverless-функции без фиксированного исходящего адресаСначала направьте их через NAT со статическим адресомНет
Весь региональный диапазон облачного провайдераНичего: он охватывает и других клиентовНет

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

Где должен храниться API-ключ и кто его видит?#

Ключ должен храниться на ваших серверах, в хранилище секретов, и нигде больше. Никогда не встраивайте его в браузерную страницу или мобильное приложение: там его может прочитать любой. Не передавайте его и в URL: в OWASP REST Security Cheat Sheet предупреждается, что ключ в URL может попасть в журналы веб-сервера. Страница оплаты обращается к вашему бэкенду, а бэкенд — к платёжному API.

Загружайте ключ при запуске из менеджера секретов или переменных окружения, а не из конфигурационного файла в репозитории. Если код хранится на GitHub, включите push protection: согласно документации GitHub, когда она «обнаруживает потенциальный секрет при попытке отправки, она блокирует отправку».

Используйте отдельный ключ для каждой среды. Каждый проект ItisPay имеет собственный ключ и собственный список разрешённых адресов, поэтому раздельные проекты для продакшена и тестовой среды означают, что утёкший ключ тестовой среды не может повлиять на реальные платежи. Ограничьте круг лиц, которые видят продакшен-ключ. Руководящие принципы Европейского банковского органа (EBA) 2019 года по безопасности ИКТ устанавливают правило доступа «need-to-know» с «минимальными правами доступа», включая технических пользователей; с 2025 года DORA распространяет эту обязанность на большинство платёжных организаций.

Затем заранее запишите, как вы будете заменять ключ, — до того как это понадобится. OWASP Cryptographic Storage Cheat Sheet рекомендует менять ключи по истечении установленного срока и всякий раз, когда есть подозрение на компрометацию, а также следить за тем, чтобы «код и процессы, необходимые для смены ключа, были готовы до того, как они понадобятся».

Как проверять вебхуки от платёжного API?#

Относитесь к вебхуку как к уведомлению о том, что что-то изменилось, но никогда как к подтверждению оплаты. Любой, кто узнает ваш callback URL, может отправить на него поддельное сообщение о «завершении». Безопасная схема такая: запросите счёт обратно через API с вашим ключом и действуйте на основании того, что вернёт API.

При создании счёта ItisPay поле callback_url задаёт адрес для обновлений статуса. Когда приходит вебхук, возьмите из него ID счёта, выполните GET-запрос к счёту по ID и выдавайте товар или зачисляйте средства только в том случае, если ответ показывает ожидаемый вами статус и сумму, которую вы выставили. В документации этот эндпоинт описан как возвращающий статус платежа и данные блокчейна «для отображения пользователям или проверки».

Несколько правил помогут сделать обработчик надёжным:

  • Принимайте вебхуки только по HTTPS и отклоняйте обычный HTTP.
  • Сделайте обработчик идемпотентным: сохраняйте ID и статус каждого обработанного счёта и пропускайте повторы, поскольку провайдеры повторно отправляют уведомления.
  • Отвечайте быстро и выполняйте основную работу в очереди, чтобы медленная база данных не вызывала повторных отправок.
  • Если провайдер подписывает вебхуки с помощью HMAC — хеша с ключом, определённого в RFC 2104, — пересчитайте подпись и сравните её функцией с постоянным временем выполнения. OWASP Webhook Security Cheat Sheet говорит прямо: «Никогда не используйте ==: это раскрывает информацию о времени и может превратить эндпоинт в оракул подписи.» Отклоняйте сообщения, у которых подписанная метка времени слишком старая.

Проверьте перед запуском в продакшен. У ItisPay есть эндпоинт, который имитирует изменение статуса для реального тестового счёта, и ещё один, который повторно отправляет последний вебхук для счёта или заказа по ID, чтобы вы могли проверить повторные отправки и дубликаты без реальных денег.

Как защитить выплаты и доступ к панели управления?#

Выплаты — это то место, где украденный ключ превращается в потерю денег, поэтому добавьте вокруг них контроль со стороны людей. Через эндпоинт выплат ItisPay фиатная выплата уходит на IBAN получателя, а криптовыплата — на адрес кошелька; и то и другое списывается с вашего доступного баланса. API выполняет то, что сказано в запросе; решать, законен ли запрос, — ваша задача.

Меры контроля, которые работают на вашей стороне:

  • Двухэтапная аутентификация для всех, у кого есть доступ к панели управления или выплатам. Законодательство ЕС о платежах уже использует эту идею для платёжных пользователей: правила PSD2 о сильной аутентификации клиента требуют минимум два независимых элемента из категорий «знание», «владение» и «присущность». Примените тот же стандарт к своим сотрудникам.
  • Сохранённые получатели. Ведите собственный список одобренных IBAN и адресов кошельков и разрешите сервису выплат отправлять средства только на адреса из этого списка. Новый получатель проходит отдельное одобрение, желательно с периодом ожидания.
  • Второй утверждающий сверх порога. Один человек готовит выплату, другой её утверждает. Порог задайте исходя из собственного уровня допустимого риска.
  • Отдельный сервис выплат. Запускайте выплаты из одного сервиса с собственным фиксированным адресом в списке разрешённых, отдельно от серверов оплаты, которые создают счета.
Мера контроляЧто она блокируетВердикт
Список разрешённых IP-адресов для ключаИспользование утёкшего ключа из-за пределов вашей сетиРаботает
Ключ только на сервереКража ключа из браузеров, приложений и репозиториевРаботает
Повторное чтение счёта после webhookПоддельные уведомления «оплачено»Работает
Сохранённые получатели и второй утверждающийВыплаты на IBAN или кошелёк злоумышленникаРаботает
Любая из этих мер по отдельности против взломанного сервера из спискаКража изнутри, кем-то уже проникшим в системуНет

Чего DORA и PCI DSS ожидают от доступа к API?#

Если вы — регулируемая финансовая компания в ЕС, эти меры не являются необязательным дополнением. Регламент о цифровой операционной устойчивости (DORA, Регламент (ЕС) 2022/2554) применяется с 17 января 2025 г., согласно EBA. Его статья 9 требует от компаний «внедрять политики, которые ограничивают физический или логический доступ» к ИКТ-активам и «внедрять политики и протоколы для механизмов строгой аутентификации». Ключ с разрешённым списком IP-адресов, доступный только серверу, и план ротации — это именно те доказательства, которые запрашивает аудитор.

PCI DSS охватывает данные карт, а не криптосчета. Если та же команда также проводит платежи картами, требование 8.4.2 предписывает многофакторную аутентификацию для всего доступа к среде данных держателей карт, а требования версии 4.0 с отложенным сроком действия стали обязательными 31 марта 2025 г.

Где меры безопасности API для платежей перестают работать?#

Эти меры сужают способы входа. Сами по себе они не делают интеграцию безопасной. Даже для отправителей webhook лист OWASP по webhook называет разрешённый список IP-адресов «лишь дополнительным уровнем», потому что «общий выходной IP-адрес не является доказательством личности».

Где это не помогает

  • Взломанный сервер из списка. Злоумышленник отправляет запросы с доверенного адреса с настоящим ключом.
  • Общие исходящие адреса. Если другие клиенты выходят в облако с того же NAT-адреса, список разрешённых адресов не может отличить их от вас.
  • Украденный пароль к панели без двухэтапного входа. Злоумышленник обходит API полностью.
  • Персональные данные в полях счёта. Публичный эндпоинт счетов ItisPay возвращает полные данные по открытым счетам без ключа, поэтому держите имена и email клиентов вне названия заказа.

Как запустить безопасную интеграцию за полдня?#

Техническую часть безопасной интеграции можно завершить за полдня, если следовать фиксированному порядку. Шаги ниже используют ItisPay; тот же порядок работает с любым провайдером.

  1. Создайте тестовый проект и отдельный производственный проект, у каждого свой ключ.
  2. Храните оба ключа в менеджере секретов и загружайте их только на сервере.
  3. Найдите публичный исходящий адрес каждой среды и укажите его в API Allowed IPs.
  4. Создайте счёт из бэкенда: отправьте POST на https://api.itispay.com/api/v1/invoices с заголовком Api-key, уникальным order_id, fiat_amount с fiat_currency EUR, монетой в поле currency и вашим callback_url.
  5. Напишите обработчик webhook: только HTTPS, идемпотентный, перед любым действием повторно читающий счёт по ID.
  6. Запустите симуляцию webhook для каждого обрабатываемого статуса, затем эндпоинт повторной отправки, чтобы проверить дубликаты.
  7. Включите выплаты последними, с сохранёнными получателями и вторым утверждающим.

Для быстрого старта ассистент Ask AI в панели по запросу пишет примеры кода, например вызов создания счёта на Node.js с уже подставленным заголовком Api-key. Относитесь к нему как к черновику: сверяйте названия полей со справочником API перед выпуском, поскольку контрактом является справочник, а не сгенерированный пример. ItisPay также публикует официальный клиент TypeScript в npm — @itispay/typescript-client.

Ассистент Ask AI от ItisPay возвращает код на Node.js, который создаёт счёт, а затем проверяет его статус (демонстрационные данные)

Если вы встраиваете это в более широкую настройку оркестрации платежей, выдавайте каждому провайдеру отдельный ключ, список разрешённых адресов и обработчик webhook. Та же запись, которую можно перечитать по ID, также питает сверку криптоплатежей для вашей финансовой команды.

Если вы хотите принимать платежи в стейблкоинах и получать евро без самостоятельного построения стека, ItisPay предоставляет API, выставление счетов, webhook и сверку, а также первый уровень безопасности платёжного API: ключи, которые можно ограничить вашими собственными IP-адресами. Лицензирование, KYC и расчёты на ваш IBAN проходят через нашего партнёра с лицензией в ЕС — поставщика услуг в сфере криптоактивов (CASP) и платёжного учреждения, а большинство команд проходит путь от KYB до первой транзакции менее чем за неделю.

Эта статья предназначена только для информационных целей и не является юридической или регуляторной консультацией.

Часто задаваемые вопросы

Можно ли вызывать платёжный API напрямую из браузера или мобильного приложения?

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

Достаточно ли списка разрешённых IP-адресов для защиты платёжного API?

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

Могут ли тестовая и производственная среды использовать один API-ключ?

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

Как часто нужно заменять ключ платёжного API?

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

Что будет, если IP-адрес нашего сервера изменится?

Запросы с нового адреса будут отклоняться, пока вы его не добавите, поэтому оформление заказа (checkout) перестанет создавать счета. Используйте статические исходящие адреса для производственной среды и добавляйте новый адрес до того, как выведете старый.

Nik Perkov

Nik Perkov

Founder, ItisPay

Share this article:

The newsletter for crypto entrepreneurs

Join founders and innovators exploring crypto payments. Get insights, product updates, and stories from businesses building the future of digital commerce.

Unsubscribe anytime. By entering your email, you agree to receive marketing emails from ItisPay. By proceeding, you agree to the Terms and Conditions and Privacy Policy.

Ready to launch stablecoin-first payments under your brand?

Stablecoin-first infrastructure with 1:1 EUR/USD backing. Deploy in 1 week. Built for high-volume PSPs and neobanks with zero volatility risk.