-
v2.4.60 — Anti-spam hardening
StableAll checks were successfulBuild & Deploy / 🔍 Prepare (push) Successful in 19sBuild & Deploy / 🧪 QA (push) Successful in 1m17sBuild & Deploy / 🏗️ Build (push) Successful in 2m33sBuild & Deploy / 🚀 Deploy (push) Successful in 25sBuild & Deploy / 🧪 Post-Deploy Verification (push) Successful in 51sBuild & Deploy / 🔔 Notify (push) Successful in 2sreleased this
2026-09-02 08:06:07 +00:00 | 1 commits to main since this releaseAnti-spam hardening for the contact form
The previous spam guard (v2.4.59 era) could still be bypassed and silently blocked legitimate quote requests. This release fixes both:
Fixes
- Proxy-safe IP extraction: rate limiting now uses the last
X-Forwarded-Forhop (appended by Traefik) instead of the client-controlled first hop, which bots rotated freely to evade the rate limit - Server-anchored time-trap: the fill-time check is now backed by an HMAC-signed form token (
FORM_TOKEN_SECRET, 24h validity, timing-safe comparison) instead of the client-suppliedform_loaded_attimestamp - RequestQuoteForm regression:
FormDatawas built from scratch without the honeypot/token hidden inputs and inputs lackednameattributes, so every legitimate product quote request was silently swallowed as spam
New modules
lib/antispam/form-token.ts— signed token issue/verifylib/antispam/client-ip.ts— XFF parsing
Ops notes
- Set
FORM_TOKEN_SECRETin the production.envbefore/with this deploy - Tests: 19 antispam specs green, typecheck clean
Downloads
- Proxy-safe IP extraction: rate limiting now uses the last