1. 30 Aug, 2026 1 commit
    • Rate-limit POST /admin/login to bound bcrypt-induced event-loop stalls · 4bb319e9
      Async bcryptjs measured to still not yield the event loop for realistic
      hash costs (~70ms compares finish before its 100ms yield threshold), so
      a login flood could still stall the same process's live MegaPay payment
      webhooks. Caps each client (or shared-proxy-bucket, see known limitation
      below) to 5 POST /admin/login attempts per rolling 60s window via
      express-rate-limit; requests over the limit get a 429 with a Vietnamese
      error and never reach adminAuth.login, so the bcrypt compare never runs.
      
      Known limitation: this app has no app.set('trust proxy', ...) configured
      and runs behind a reverse proxy in production, so express-rate-limit's
      default req.ip-based bucketing will key off the proxy's address, not the
      real client IP. In production this enforces "5 attempts/minute in
      aggregate behind the proxy" rather than "5 per real client IP" — an
      accepted trade-off for this low-traffic internal tool, but not the same
      guarantee trust proxy + per-IP limiting would give. Configuring trust
      proxy is an infrastructure change, left out of scope here.
      tdgiang authored
  2. 29 Aug, 2026 13 commits
  3. 28 Aug, 2026 20 commits