PCI-DSS Перевірка Луна
MirApi Gateway сканує кожне тіло запиту на сирі номери кредитних карток за допомогою алгоритму Луна і блокує їх автоматично. Це вбудований захист, завжди активний — жодна конфігурація не потрібна.
Навіщо це важливо
Section titled “Навіщо це важливо”Надсилання сирих номерів карток до будь-якого API — навіть до легітимних платіжних процесорів — є серйозним порушенням PCI-DSS. Один витік номеру картки в логах або невірно маршрутизованому запиті може призвести до регуляторних штрафів та відповідальності за шахрайство. MirApi усуває цей ризик на рівні проксі — ще до того як запит залишить вашу інфраструктуру.
Нульове збереження: Тіло запиту сканується тільки в пам’яті. Навіть якщо номер картки виявлено і заблоковано — вміст тіла ніколи не записується в логи, на диск або будь-яке постійне сховище. Записується лише метадані: IP клієнта, Unix timestamp та group_id.
Як це працює
Section titled “Як це працює”На кожному запиті, перед пересиланням до upstream API:
- Тіло запиту зчитується в пам’ять
- Всі послідовності 13–16 цифр підряд витягуються regex-скануванням
- Кожна послідовність перевіряється за алгоритмом Луна (контрольна сума, що використовується всіма великими брендами карток)
- Якщо будь-яка послідовність проходить перевірку Луна → запит блокується негайно з
400 Bad Request - Блокування логується (тільки метадані) для вашого журналу аудиту в дашборді
Ця перевірка виконується перед idempotency, логікою повторів та пересиланням upstream — тіло ніколи не залишає проксі.
Приклад заблокованого запиту
Section titled “Приклад заблокованого запиту”curl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -d '{"card_number": "4111111111111111", "amount": 15000}'Відповідь:
HTTP/1.1 400 Bad RequestContent-Type: text/plain
Error: Clear-text payment data detected. Please use tokenization (Stripe/Braintree tokens) instead of raw card numbers.Що блокується (і чому)
Section titled “Що блокується (і чому)”Алгоритм Луна — це стандартна галузева контрольна сума для всіх великих брендів карток. Будь-яка послідовність цифр що:
- Має довжину 13–16 цифр (без пробілів, дефісів або інших символів між цифрами)
- Проходить контрольну суму Луна
…трактується як потенційний номер картки і блокується.
Підтримувані бренди:
| Бренд | Довжина | Префікс |
|---|---|---|
| Visa | 16 цифр | Починається з 4 |
| Mastercard | 16 цифр | Починається з 51-55 або 2221-2720 |
| American Express | 15 цифр | Починається з 34 або 37 |
| Discover | 16 цифр | Починається з 6011, 622, 64 або 65 |
| Diners Club | 14–16 цифр | Починається з 300-305, 309, 36, 38 або 39 |
Що пропускається
Section titled “Що пропускається”Валідатор блокує лише валідні номери карток (контрольна сума Луна пройдена). Числа що схожі на номери карток, але не проходять Луна — пропускаються. Наприклад:
{"amount": 49.431, "currency": "4444121111112222"}Послідовність 4444121111112222 не проходить перевірку Луна → не розпізнається як номер картки → запит проходить. Завжди використовуйте токенізовані значення (Stripe токени: tok_visa, pm_xxx, src_xxx) замість сирих номерів карток.
Правильне використання — Токени
Section titled “Правильне використання — Токени”# ❌ Неправильно — буде заблокованоcurl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -d '{"card": "4111111111111111", "amount": 2000}'
# ✅ Правильно — токенізована картка (Stripe.js або мобільний SDK створює токен)curl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -H "X-Identity-Key: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{"source": "tok_visa", "amount": 2000, "currency": "usd"}'Журнал аудиту
Section titled “Журнал аудиту”При виявленні та блокуванні номеру картки MirApi записує лише метадані (тіло ніколи не зберігається):
| Поле | Опис |
|---|---|
client_ip | IP-адреса запитувача |
timestamp | Unix timestamp заблокованого запиту |
group_id | Ідентифікатор вашої групи |
Цей журнал аудиту видно в розділі Security Events вашого дашборду.