alexgrizzled/access-attempts

Access attempts

Installs: 5

Dependents: 0

Suggesters: 0

Security: 0

Stars: 1

Watchers: 1

Forks: 0

Open Issues: 0

Type:symfony-service

5.3 2021-10-16 10:48 UTC

This package is auto-updated.

Last update: 2024-04-29 04:45:33 UTC


README

##AccessAttempts - Попытка доступа

В коде есть места, в которых нужно ограничить частые запросы, что бы избежать цикличный подбор данных или заблокировать запросы парсинг процессов.

  • Via Composer
composer require alexgrizzled/access-attempts

####Пример использования:

# config/services.yaml
parameters:
    login.ip.attempt.max: 3
    login.ip.attempt.interval: 300
    
    login.email.attempt.max: 5
    login.email.attempt.interval: 600

services:
    AlexGrizzled\Service\AccessAttempts: ~
<?php

namespace App\Controller;

use AlexGrizzled\Service\AccessAttempts;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="login")
     */
    public function login(Request $request, AccessAttempts $accessAttempts): Response
    {
        // ...
        
        $ip = $request->getClientIp();
        $email = $request->request->get('email');
        
        if (false === $accessAttempts->has('login.ip', $ip) || false === $accessAttempts->has('login.email', $email)) {
            throw new Exception('Ну очень много попыток.');
        }
        
        // ...
    }
}

Если не указать параметры в config/services.yaml, то по умолчанию будут применены следующие характеристики:

(ResourceName).attempt.max - Максимально количество попыток: 3 раза

(ResourceName).attempt.interval - Интервал учёта попыток: 600 секунд

####Примечание Выше изложенный пример не претендует на copy past в вашем коде, так как в symfony за обработку данных в login отвечает клас унаследованный от Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator

###Ниже приведённый пример показывает как заблокировать злостных нарушителей на долгий срок

# config/services.yaml
parameters:
    login.ip.attempt.max: 3
    login.ip.attempt.interval: 300
    
    login.day.attempt.max: 6
    login.day.attempt.interval: 86400

services:
    AlexGrizzled\Service\AccessAttempts: ~
<?php

namespace App\Controller;

use AlexGrizzled\Service\AccessAttempts;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="login")
     */
    public function login(Request $request, AccessAttempts $accessAttempts): Response
    {
        // ...
        
        $ip = $request->getClientIp();
        
        // Проверка попыток за день, без суммирования
        if (false === $accessAttempts->has('login.day', $ip, false)) {
            // Бан на 24 часа
            // В этом месте можно и в фаервол правило записать, но это другая история ;)
            throw new Exception('Ну очень много попыток.');
        }
        
        // Проверка попытки за последнии 5 минут
        if (false === $accessAttempts->has('login.ip', $ip)) {
            // Суммируем неудачную попытку за день
            $accessAttempts->has('login.day', $ip)
            
            // Бан на 5 минут
            throw new Exception('Попозже попробуйте повторить');
        }
        
        // ...
    }
}