Skip to content

Commit f0001b4

Browse files
committed
apply rate limit for all target ips
1 parent 1eac3e0 commit f0001b4

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

app/Providers/AppServiceProvider.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Providers;
44

5+
use App\Network\DNSLookup;
56
use Illuminate\Cache\RateLimiting\Limit;
67
use Illuminate\Http\Request;
78
use Illuminate\Support\Facades\RateLimiter;
@@ -24,20 +25,30 @@ public function boot(): void
2425
{
2526
RateLimiter::for('site', function (Request $request) {
2627
$siteHost = 'default';
27-
$siteIp = 'default';
2828

2929
if (is_string($request->input('url'))) {
3030
$siteHost = parse_url($request->input('url'), PHP_URL_HOST);
3131
}
3232

33-
if ($siteHost !== 'default' && $dnsResult = dns_get_record((string) $siteHost, DNS_A)) {
34-
$siteIp = $dnsResult[0]['ip'];
33+
// Define a rate limit per target IP
34+
$siteIpLimits = [];
35+
36+
if ($siteHost !== 'default') {
37+
$siteIps = (new DNSLookup)->getIPs($siteHost);
38+
39+
foreach ($siteIps as $siteIp) {
40+
$siteIpLimits[] = Limit::perMinute(5)->by("siteip-" . $siteIp);
41+
}
42+
}
43+
44+
if (!count($siteIpLimits)) {
45+
$siteIpLimits = [Limit::perMinute(5)->by("siteip-default")];
3546
}
3647

3748
return [
3849
Limit::perMinute(5)->by("sitehost-" . $siteHost),
39-
Limit::perMinute(10)->by("siteip-" . $siteIp),
40-
Limit::perMinute(50)->by("ip-" . $request->ip())
50+
Limit::perMinute(50)->by("requestip-" . $request->ip()),
51+
...$siteIpLimits
4152
];
4253
});
4354
}

0 commit comments

Comments
 (0)