Перейти до вмісту

PCI-DSS Перевірка Луна

MirApi Gateway сканує кожне тіло запиту на сирі номери кредитних карток за допомогою алгоритму Луна і блокує їх автоматично. Це вбудований захист, завжди активний — жодна конфігурація не потрібна.

Надсилання сирих номерів карток до будь-якого API — навіть до легітимних платіжних процесорів — є серйозним порушенням PCI-DSS. Один витік номеру картки в логах або невірно маршрутизованому запиті може призвести до регуляторних штрафів та відповідальності за шахрайство. MirApi усуває цей ризик на рівні проксі — ще до того як запит залишить вашу інфраструктуру.

Нульове збереження: Тіло запиту сканується тільки в пам’яті. Навіть якщо номер картки виявлено і заблоковано — вміст тіла ніколи не записується в логи, на диск або будь-яке постійне сховище. Записується лише метадані: IP клієнта, Unix timestamp та group_id.

На кожному запиті, перед пересиланням до upstream API:

  1. Тіло запиту зчитується в пам’ять
  2. Всі послідовності 13–16 цифр підряд витягуються regex-скануванням
  3. Кожна послідовність перевіряється за алгоритмом Луна (контрольна сума, що використовується всіма великими брендами карток)
  4. Якщо будь-яка послідовність проходить перевірку Луна → запит блокується негайно з 400 Bad Request
  5. Блокування логується (тільки метадані) для вашого журналу аудиту в дашборді

Ця перевірка виконується перед idempotency, логікою повторів та пересиланням upstream — тіло ніколи не залишає проксі.

Приклад заблокованого запиту

Section titled “Приклад заблокованого запиту”
Terminal window
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 Request
Content-Type: text/plain
Error: Clear-text payment data detected. Please use tokenization (Stripe/Braintree tokens) instead of raw card numbers.

Алгоритм Луна — це стандартна галузева контрольна сума для всіх великих брендів карток. Будь-яка послідовність цифр що:

  • Має довжину 13–16 цифр (без пробілів, дефісів або інших символів між цифрами)
  • Проходить контрольну суму Луна

…трактується як потенційний номер картки і блокується.

Підтримувані бренди:

БрендДовжинаПрефікс
Visa16 цифрПочинається з 4
Mastercard16 цифрПочинається з 51-55 або 2221-2720
American Express15 цифрПочинається з 34 або 37
Discover16 цифрПочинається з 6011, 622, 64 або 65
Diners Club14–16 цифрПочинається з 300-305, 309, 36, 38 або 39

Валідатор блокує лише валідні номери карток (контрольна сума Луна пройдена). Числа що схожі на номери карток, але не проходять Луна — пропускаються. Наприклад:

{"amount": 49.431, "currency": "4444121111112222"}

Послідовність 4444121111112222 не проходить перевірку Луна → не розпізнається як номер картки → запит проходить. Завжди використовуйте токенізовані значення (Stripe токени: tok_visa, pm_xxx, src_xxx) замість сирих номерів карток.

Правильне використання — Токени

Section titled “Правильне використання — Токени”
Terminal window
# ❌ Неправильно — буде заблоковано
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"}'

При виявленні та блокуванні номеру картки MirApi записує лише метадані (тіло ніколи не зберігається):

ПолеОпис
client_ipIP-адреса запитувача
timestampUnix timestamp заблокованого запиту
group_idІдентифікатор вашої групи

Цей журнал аудиту видно в розділі Security Events вашого дашборду.