From d20f1a95281e1896366ec954a8a5f6cc2b0eed7c Mon Sep 17 00:00:00 2001 From: velz Date: Mon, 23 Feb 2026 18:54:20 +0530 Subject: [PATCH] FEAT_API_RATE_LIMIT_COND --- app/Filters/AuthApiRateLimitFilter.php | 5 +++-- app/Filters/JwtApiRateLimitFilter.php | 5 +++-- app/Helpers/utility_helper.php | 10 ++++++++-- app/Libraries/RateLimiterService.php | 1 + 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/Filters/AuthApiRateLimitFilter.php b/app/Filters/AuthApiRateLimitFilter.php index 29ce42f..fd2efca 100644 --- a/app/Filters/AuthApiRateLimitFilter.php +++ b/app/Filters/AuthApiRateLimitFilter.php @@ -39,7 +39,7 @@ class AuthApiRateLimitFilter implements FilterInterface public function before(RequestInterface $request, $arguments = null) { // $this->limiter->unblockUser('9698262411');die; - $fingerprint = generateFingerprint(); + $fingerprint = generateFingerprint(exclude_ua: true); // echo $fingerprint;die; // 1. IP-level check $ipResult = $this->limiter->checkIp($fingerprint, 'authApi'); @@ -96,7 +96,8 @@ class AuthApiRateLimitFilter implements FilterInterface return; // 2xx/3xx = success; 429/403/451 already handled } - $fingerprint = $request->getVar('rateLimitFingerprint') ?? generateFingerprint(); + $fingerprint = $request->getVar('rateLimitFingerprint') ?? generateFingerprint(exclude_ua: true); + $identity = $request->getVar('rateLimitIdentity') ?? resolveIdentity($request); diff --git a/app/Filters/JwtApiRateLimitFilter.php b/app/Filters/JwtApiRateLimitFilter.php index 1644aea..6e0b84f 100644 --- a/app/Filters/JwtApiRateLimitFilter.php +++ b/app/Filters/JwtApiRateLimitFilter.php @@ -39,7 +39,7 @@ class JwtApiRateLimitFilter implements FilterInterface public function before(RequestInterface $request, $arguments = null) { - $fingerprint = generateFingerprint(); + $fingerprint = generateFingerprint(exclude_ua: true); // echo $fingerprint;die; // 1. IP-level throttle + block check $ipResult = $this->limiter->checkIp($fingerprint, 'jwtApi'); @@ -84,7 +84,8 @@ class JwtApiRateLimitFilter implements FilterInterface return; } - $fingerprint = $request->getGlobal('rateLimitFingerprint') ?? generateFingerprint(); + $fingerprint = $request->getGlobal('rateLimitFingerprint') ?? generateFingerprint(exclude_ua: true); + // $identity = $request->getGlobal('rateLimitIdentity') ?? $this->resolveIdentityFromJwt(); $identity = $request->getGlobal('rateLimitIdentity') ?? ''; diff --git a/app/Helpers/utility_helper.php b/app/Helpers/utility_helper.php index 893a32d..bac046f 100755 --- a/app/Helpers/utility_helper.php +++ b/app/Helpers/utility_helper.php @@ -773,7 +773,7 @@ function getRealClientIP() return $request->getIPAddress(); } -function generateFingerprint(): string +function generateFingerprint(bool $exclude_ua = false): string { $request = service('request'); @@ -804,7 +804,11 @@ function generateFingerprint(): string } // return $ua . '_' . $ipGroup; + if($exclude_ua){ + return hash('sha256', $ipGroup); + } return hash('sha256', $ua . '|' . $ipGroup); + } @@ -861,7 +865,9 @@ function generateFingerprint(): string $limiter = \Config\Services::limiter(); // or your custom limiter service $fingerprint = $request->getVar('rateLimitFingerprint') - ?? generateFingerprint(); + ?? generateFingerprint(exclude_ua: true); + + $identity = $request->getVar('rateLimitIdentity') ?? resolveIdentity($request); diff --git a/app/Libraries/RateLimiterService.php b/app/Libraries/RateLimiterService.php index a5120f5..3bcb564 100644 --- a/app/Libraries/RateLimiterService.php +++ b/app/Libraries/RateLimiterService.php @@ -113,6 +113,7 @@ class RateLimiterService 'level' => $level, 'blocked_at' => time(), 'fingerprint'=> $fingerprint, + 'ip' => getRealClientIP(), ]; // Duration 0 = store for 10 years (permanent until manual unblock)