Laravel: IP requests per second

dakata__92

Super Moderator
Здравейте. Пиша си специфична защитна стена за един проект на Ларавел. Необходимо ми е в middleware-а с име Firewall да добавя и засичане броя на заявките подадени от едно ИП за 1 секунда. Throttle не ми върши работа.
Код:
private function firewall($request)
    {
        $logs = storage()->logs();
        $data = $logs->data();
        if (in_array($request->ip(), config('http.middleware.firewall.blocked.ip', []))) {
            $message = '[Firewall]: Forbidden 403 -> Blocked Internet Protocol!';
            $logs->insert('warning', 'guests', $message, $data);
            abort(403);
        }
    }
Искам в този метод да добавя проверката и да си извърша логиката по него. Как мога да засека колко заявки са направени към дадената страница? Предполагам ще трябва да кеширам някаква информация.

Нещо подобно ли ми е необходимо?

Код:
$count = cache()->get($request->ip()) ? cache()->get($request->ip()) : 0;
cache()->put($request->ip(), $count+1, 60);
dd( cache()->get($request->ip()));
 
Драснах го по този начин.

Код:
private function firewall($request)
    {
        $logs = storage()->logs();
        $data = $logs->data();
        $ip = $request->ip();
        $ipRequestHash = sha1($ip);
        $ipTmpBlocked = 'tmp_blocked_'.$ip;

        if (in_array($ip, config('http.middleware.firewall.blocked.ip', []))) {
            $message = '[Firewall]: Forbidden 403 -> Blocked Internet Protocol!';
            $logs->insert('alert', 'guests', $message, $data);
            abort(403);
        }
        if (cache()->get($ipTmpBlocked)) {
            $message = '[Firewall]: Forbidden 403 -> Temporarily Blocked Internet Protocol!';
            $logs->insert('warning', 'guests', $message, $data);
            abort(403);
        }
        cache()->put($ipRequestHash, (cache()->get($ipRequestHash) ?? 0) + 1, 1);
        if (cache()->get($ipRequestHash) > config('http.middleware.firewall.request.max', 5)) {
            $message = '[Firewall]: 429 -> Too Many Requests!';
            $logs->insert('notice', 'guests', $message, $data);
            cache()->put($ipTmpBlocked, true, config('http.middleware.firewall.request.blocked.ttl', 60));
            abort(429);
        }
    }

Има ли по-лесен или правилен вариант?
 
uphero каза:
Това не е ли работа на сървъра?

Сървъра си върши работата. Нужно ми е просто ниво над него с по-просто решение на казуса.
 

Горе