Přeskočit obsah

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/paymentLogs a /api/paymentSettings nejsou dostupné anonymně.
  • Klientský veřejný list dokladů vyžaduje session stejného klienta jako filtr client_id.
  • getPublicInvoice přes token nevrací company_id ani company_account_id.
  • confirm_payment nezaplatí rezervaci jiného klienta.