Документація
Безпека
Швидкий старт новеАрхітектураШлюзиHTTP APIПередоплата і правилаФіскалізаціяСповіщення і CRMПосилання на оплатуАналітика новеПольщаНативний шлюз ShopifyБезпека нове
Модель
- Карткові дані не торкаються сервера (hosted-сторінки шлюзів) — PCI DSS SAQ A.
- Кожен вебхук перевіряється криптографічно (ECDSA, HMAC, RSA, SHA-384/SHA1 за схемою шлюзу) з timing-safe порівнянням; статус перечитується з API.
- Посилання покупця захищені confirmation number замовлення або 96-бітним токеном; id замовлень перебрати не можна (403/404, rate-limit).
- Одна транзакція на платіж (м’ютекс + прапорець), дедуп Shopify-вебхуків, ліміт тіла 256 КБ, generic-помилки без стеку.
- Адмінка — за ключем з timing-safe порівнянням, 404 без ключа,
noindex.
Пентест-набір (у репозиторії, npm run pentest)
| Клас | Перевірки |
|---|---|
| Підробка вебхуків | без підпису, сміття, чужий ключ, підпис від іншого тіла, +1 байт, replay ×10 паралельно, протухлий timestamp (Stripe) |
| Підміна суми/статусу | підписане «success», поки API каже created; недоплата → unpaid + тег; валюта |
| Перебір і доступ | /pay без/з неправильним c, масивні параметри, path traversal, GID у id, чужі/оплачені/COD замовлення, невідомі токени посилань |
| Гонки | 15 паралельних /pay → один рахунок; 10 паралельних success → одна транзакція |
| Shopify HMAC | без/порожній/чужий/усічений HMAC, replay webhook id, ворожі payload в orders/create |
| DoS, витоки, ін’єкції | 300 КБ тіла, глибокий JSON, флуд поганими підписами (без шторму в pubkey), 502 від Shopify → generic 500, CRLF/XSS/SQL у назвах |
Поточний стан: 88 пентест-перевірок + 111 функціональних + 698 модульних — усі зелені; npm audit без вразливостей. Повний звіт — PENTEST.md.
Панель безпеки та інспектор вебхуків нове
- Адмінка → 🛡️ Безпека (власник): невдалі входи за 7 днів по IP і логінах, заблоковані IP з кнопкою «розблокувати», активні сесії (хто, IP, браузер, час) із «завершити» по одній або «завершити всі інші» — наприклад, після витоку пароля; стан захисту (2FA, вхід з .env, HTTPS-cookie, ?key=). Сесії зберігаються в базі: відкликана помирає миттєво, вихід теж відкликає.
- Адмінка → 📥 Вебхуки: кожен вхідний вебхук від PSP і Shopify — результат перевірки підпису, збіг із замовленням, наша відповідь, тривалість, IP, заголовки (секрети замасковано) і тіло; фільтри за джерелом і підписом; «↻ повторити» пересинхронізовує замовлення. Бейдж на вкладці — кількість невірних підписів за добу. Зберігаються останні 2000 (
WEBHOOK_LOG_KEEP).
Здоров’я системи нове
- Адмінка → 🩺 Здоров’я: стан ok / увага / критично зі списком проблем; процес (аптайм, пам’ять, затримка event loop), SQLite (
quick_check, розмір, WAL), диск, вік останнього бекапу, вхідні вебхуки за добу, вихідні події в повторі, чеки pending, невдалі повернення, по кожному PSP — створено/оплачено/відмов і остання причина; «Live-перевірка PSP» міряє латентність кожного шлюзу. Останні помилки процесу — на сторінці. - JSON для моніторингу:
GET /admin/api/health?full=1(503, коли критично),?deep=1— з live-пробами. Telegram:/health,/health psp. - Сторож кожні 5 хв: одне повідомлення в Telegram, коли стан стає критичним, і одне при відновленні (
HEALTH_WATCH=offвимикає).
Залишкові ризики (інфраструктура)
- HTTPS/HSTS на edge,
TRUST_PROXY=1за nginx/Cloudflare — інакше rate-limit бачить усіх як одну IP. - Секрети в
.envз правами 600 або secret manager; ротаціяADMIN_KEY, вебхук-секретів, токенів шлюзів. - Токен Shopify Admin (
write_orders) — мінімальні scopes, окремий custom app. - Живі пісочниці шлюзів з нашого середовища розробки недоступні: підписи звірені з офіційними формулами й SDK; перший прогін на тестових ключах — обов’язковий.