Laravel: IP requests per second

C++ JAVA
Post Reply
User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3335
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 127

Laravel: IP requests per second

Post by dakata__92 » Fri Oct 09, 2020 10:15 am

Здравейте. Пиша си специфична защитна стена за един проект на Ларавел. Необходимо ми е в middleware-а с име Firewall да добавя и засичане броя на заявките подадени от едно ИП за 1 секунда. Throttle не ми върши работа.

Code: Select all

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);
        }
    }
Искам в този метод да добавя проверката и да си извърша логиката по него. Как мога да засека колко заявки са направени към дадената страница? Предполагам ще трябва да кеширам някаква информация.

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

Code: Select all

$count = cache()->get($request->ip()) ? cache()->get($request->ip()) : 0;
cache()->put($request->ip(), $count+1, 60);
dd( cache()->get($request->ip()));

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3335
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 127

Re: Laravel: IP requests per second

Post by dakata__92 » Fri Oct 09, 2020 11:30 am

Драснах го по този начин.

Code: Select all

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
Потребител
Потребител
Posts: 773
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 32
Location: Казанлък
Contact:

Re: Laravel: IP requests per second

Post by uphero » Fri Oct 09, 2020 5:27 pm

Това не е ли работа на сървъра?

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3335
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 127

Re: Laravel: IP requests per second

Post by dakata__92 » Sat Oct 10, 2020 6:45 pm

uphero wrote:
Fri Oct 09, 2020 5:27 pm
Това не е ли работа на сървъра?
Сървъра си върши работата. Нужно ми е просто ниво над него с по-просто решение на казуса.

Post Reply