How to Set Up Rate Limiting on Any Web App (Free, No Code Changes)

1 1 14
calendar_today agoschedule2 min read

The Problem

Your login page, search endpoint, or contact form is getting hammered. Rate limiting is the fix — but implementing it in application code means finding every endpoint, writing middleware, choosing a storage backend, and deploying changes. On a WAF, you set it once and it applies everywhere.

Why WAF-Level Rate Limiting Is Better

Approach Code-Level WAF-Level
Setup time Hours to days 5 minutes
Code changes Required None
Applies to One endpoint at a time All routes with one rule
Storage Redis/Memcached needed Built into WAF
Performance impact Hits your app server Blocked at proxy
Updates Deploy new code Change a rule in dashboard

Step-by-Step: Rate Limit Setup

1. Log into SafeLine Dashboard
Go to https://<your-ip>:9443. Navigate to Rules -> Add Rule -> Rate Limiting.

2. Create Your First Rule — Login Protection

Name: Login brute force protection
Match: URL contains /login OR /wp-login.php OR /auth
Limit: 5 requests per minute per IP
Action: Block (return 429 Too Many Requests)
Block duration: 15 minutes

This stops credential stuffing cold. An attacker who tries 5 wrong passwords in 60 seconds gets blocked for 15 minutes. That's a maximum of 480 attempts per day — vs unlimited without rate limiting.

3. Search Endpoint Protection

Name: Search rate limit
Match: URL contains /search OR /query
Limit: 30 requests per minute per IP
Action: Challenge (JS captcha)

Search endpoints are expensive. A single user running a script can do 1,000+ queries per minute and degrade performance for everyone. 30/min is generous for humans but stops scripts.

4. Global Baseline

Name: Global request limit
Match: /*
Limit: 300 requests per minute per IP
Action: Throttle

Catches anything that slips through specific rules. 300/min = 5/sec, which is more than any human needs.

What Happens When a Limit Is Hit

SafeLine logs every rate limit trigger to the Attack Log. You'll see:

  • Which IP triggered it
  • Which endpoint they were hitting
  • Time of the trigger
  • Whether they got blocked, challenged, or throttled

Watch the Attack Log for the first 24 hours. You might discover endpoints you didn't know were getting hammered.

Adjusting Limits — What I Learned

From running a WAF for 30 days on a production site:

  • Login: 5/min was right. Zero legitimate users complained.
  • Search: 30/min was too strict. Bumped to 60/min after a user reported captcha fatigue.
  • API: 100/min per API key was the sweet spot. Power users never hit it; scrapers got blocked.
  • Global: 300/min per IP was generous. Never triggered by real traffic, only by vulnerability scanners.

FAQ

Will legitimate users get blocked?

Rarely. Set generous limits (60-300/min) for read endpoints. Only use strict limits (5-10/min) for login, password reset, and registration. Monitor for false positives in the first week.

What if I'm behind Cloudflare or another proxy?

SafeLine reads X-Forwarded-For headers automatically. Rate limiting works correctly behind proxies — it rate-limits the real client IP, not the proxy IP.

Can I set different limits for different users?

Create separate rules for authenticated vs unauthenticated paths. For API key-based limiting, you can match on the Authorization header or specific URL path prefixes.


Try SafeLine Community Edition — free, self-hosted, and takes 5 minutes to deploy:

bash -c "$(curl -fsSLk https://waf.chaitin.com/release/latest/manager.sh)" -- --en

Dashboard: https://<your-server-ip>:9443 | Docs

What's the one endpoint on your site that's getting hit the hardest right now? Start there.

🔥 Join developers growing publicly
Share your knowledge, build in public, and grow your developer presence with a global community.

More Posts

I’m a Senior Dev and I’ve Forgotten How to Think Without a Prompt

Karol Modelskiverified - Mar 19

Comparison: Universal Import vs. Plaid/Yodlee

Pocket Portfolio - Mar 12

How I Built a React Portfolio in 7 Days That Landed ₹1.2L in Freelance Work

Dharanidharan - Feb 9

Delivering Database Changes

Steve Fentonverified - Jul 22

The Interface of Uncertainty: Designing Human-in-the-Loop

Pocket Portfolio - Mar 10
chevron_left
513 Points16 Badges
17Posts
0Comments
1Connections
Homelab operator. Security tools. Self-hosted everything. Open source.

Related Jobs

View all jobs →