Doklady a platby¶
Entity: Invoice, PaymentLog, PaymentSettings (tabulky invoices, payment_logs, payment_settings)
Funkce: clientBooking — akce confirm_payment, comgatePayment, getPublicInvoice
Prověřeno proti commitu: rozpracováno
Testy: backend/tests/Feature/Audit/DokladyPlatbyAuditTest.php
Routy¶
| Routa | Perimetr | Ochrana | Controller |
|---|---|---|---|
GET/POST/PUT/DELETE /api/invoices |
interní | oprávnění payments |
EntityCrudController CRUD |
GET/POST/PUT/DELETE /api/paymentLogs |
interní | oprávnění payments |
EntityCrudController CRUD |
GET/POST/PUT/DELETE /api/paymentSettings |
interní | oprávnění systémových nastavení | EntityCrudController CRUD |
GET /api/public/invoices |
veřejný klientský | klientská session a filtr client_id |
EntityCrudController::publicList |
GET /api/public/paymentSettings |
veřejný | veřejný list, filtrování přes key |
EntityCrudController::publicList |
POST /api/public/getPublicInvoice |
veřejný token | invoice_token |
FunctionsController::getPublicInvoice |
POST /api/public/comgatePayment |
veřejný | podle akce | FunctionsController::comgatePayment |
POST /api/public/clientBooking confirm_payment |
veřejný klientský | staff nebo klientská session | FunctionsController::bookingConfirmPayment |
Opravené nálezy¶
PAY-03 — Veřejný list dokladů vrací interní identifikátor firmy (nízká)¶
Stav: opraveno
Test: PAY-03: veřejný list dokladů nevrací interní identifikátor firmy
Ověřený fakt — veřejný list dokladů používá obecný SELECT *, company_id AS company_account_id
a sanitizace pro invoices zatím neodstraňuje company_id ani company_account_id.
Oprava — public sanitizace pro invoices odstraňuje company_account_id před odesláním
klientské odpovědi.
Dopad — klientské API vrací interní tenant identifikátor. Nejde o přímé zpřístupnění obsahu cizí firmy, ale je to zbytečný interní údaj na veřejném perimetru.
Nálezy¶
PAY-05 — Stav Comgate platby lze zjistit podle číselného ID rezervace (střední)¶
Stav: otevřený
Test: PAY-05: comgatePayment get_payment_result neprozradí stav podle číselného ID rezervace bez session
Ověřený fakt — get_payment_result přijme booking_id, a pokud je hodnota číselná,
vyhledá rezervaci podle primárního klíče bez klientské session. Vrací stav platby, stav rezervace,
typ služby a čas.
Dopad — číselná ID rezervací jsou odhadnutelná. Endpoint tak může prozradit existenci rezervace, termín a stav platby. Pro veřejný návrat z brány by se měl používat neuhodnutelný interní platební identifikátor nebo klientská session.
Ověřené bez nálezu¶
- Interní endpointy
/api/invoices,/api/paymentLogsa/api/paymentSettingsnejsou dostupné anonymně. - Klientský veřejný list dokladů vyžaduje session stejného klienta jako filtr
client_id. getPublicInvoicepřes token nevracícompany_idanicompany_account_id.confirm_paymentnezaplatí rezervaci jiného klienta.