Files
mercadodevida/work/artifacts/F-146/security.json
2026-08-22 12:52:13 +02:00

16 lines
1.2 KiB
JSON

{
"feature_id": "F-146",
"agent": "security",
"stage": "security_gate",
"verdict": "APPROVED",
"summary": "ReportingService uses fully parameterized SQL queries — all user input (dates, UUIDs, channel) passes through $1..$8 parameterized placeholders, preventing SQL injection. No new routes without auth. RBAC enforced via requireReportingPermission on both endpoints.",
"checks": [
{"item": "SQL injection prevention", "ok": true, "evidence": "All user-supplied values (from/to/channel/storeId/terminalId) are passed as $N parameters. No string interpolation of user input."},
{"item": "Authentication required", "ok": true, "evidence": "Both /reporting/summary and /reporting/sales call authenticate; customer role (no REPORTING_SALES) gets 403."},
{"item": "No new auth/secrets added", "ok": true, "evidence": "No new auth middleware, no new secrets, no new environment variables."},
{"item": "IDOR scope", "ok": true, "evidence": "Reporting is aggregate data only; no per-order detail endpoint exposed."},
{"item": "Performance (no N+1)", "ok": true, "evidence": "CTE pattern from architecture doc: single query per endpoint; COUNT uses separate lightweight query."}
],
"issues": []
}