feat(security): add per-IP rate limiting on guest-order endpoints (#19) #29
Open
hermes
wants to merge 1 commit from
fix/guest-order-rate-limiting into master
pull from: fix/guest-order-rate-limiting
merge into: jocke:master
jocke:master
jocke:fix/guest-payment-pending-review
jocke:fix/guest-token-session-storage
jocke:fix/persist-amount-paid
jocke:fix/order-user-guest-check-constraint
jocke:fix/guest-qr-scannability
jocke:feature/guest-checkout
jocke:fix/swish-qr-scannability
jocke:feature/swish-qr-payment
jocke:develop
jocke:feature/auto-version-from-tag
jocke:fix/admin-table-styling
jocke:feature/expired-token-logout
jocke:chore/dockerfile-self-contained
jocke:chore/pre-commit-coverage-thresholds
jocke:feature/umami-analytics
jocke:refactor/admin-fulfillment
jocke:feature/admin-fulfillment-tracking
jocke:feature/account-settings-dropdown
jocke:feature/cancel-edit-pending-orders
1 commit
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
68cb20edba |
feat(security): add per-IP rate limiting on guest-order endpoints
POST /api/guest-orders is fully public (permitAll) with no captcha,
throttling, or IP-based limiting. An attacker can flood the orders table
(DB bloat / DoS) and mass-generate self-confirmed paid orders.
Changes:
- GuestOrderRateLimitFilter: in-memory sliding-window rate limiter
(OncePerRequestFilter + @Component). Per-IP limits:
POST /api/guest-orders: 5 req/min (configurable)
Other /api/guest-orders/**: 20 req/min (configurable)
Returns 429 with Swedish JSON error when exceeded.
Respects X-Forwarded-For and X-Real-IP headers.
- SecurityConfig: register the filter before JWT filter
- GuestOrderControllerTest: set high limits (1000) and reset filter
state in @BeforeEach to avoid cross-test interference
Config via application properties:
app.rate-limit.guest-create (default 5)
app.rate-limit.guest-default (default 20)
Phase 0 interim: in-memory, per-JVM, resets on restart. For production,
use Bucket4j + Redis or nginx limit_req.
Closes #19
|