src/EventSubscriber/CheckRequestSubscriber.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\RequestEvent;
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. use Symfony\Component\RateLimiter\RateLimiterFactory;
  7. use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
  8. class CheckRequestSubscriber implements EventSubscriberInterface
  9. {
  10.     private $anonymousApiLimiter;
  11.     public function __construct(RateLimiterFactory $anonymousApiLimiter)
  12.     {
  13.         $this->anonymousApiLimiter $anonymousApiLimiter;
  14.     }
  15.     public function onKernelRequest(RequestEvent $event): void
  16.     {
  17.         //TODO :: remove cross site scripting(request value strip)
  18.         $request $event->getRequest();
  19.         if ($event->getRequest()->getMethod() == 'GET' || $event->getRequest()->getMethod() == "POST") {
  20.             $input $event->getRequest()->request->all();
  21.             array_walk_recursive($input, function (&$input) {
  22.                 if (is_array($input)) {
  23.                     array_walk_recursive($input, function (&$input) {
  24.                         $input strip_tags($input);
  25.                     });
  26.                 } else {
  27.                     $input strip_tags($input);
  28.                 }
  29.             });
  30.             foreach ($input as $key => $data) {
  31.                 $event->getRequest()->request->set($key$data);
  32.             }
  33.             //TODO: 5 request per second
  34.             $time_interval 300#In seconds
  35.             $max_requests 5// TODO REQUEST 5
  36.             $session $request->getSession();
  37.             $session->set('last_session_request'time());
  38.             $lastSessionRequest $session->get('last_session_request');
  39.             $request_cnt $session->get('request_cnt');
  40.             $fast_request_check = ($lastSessionRequest time() - $time_interval);
  41.             if (!$request->hasSession()) {
  42.                 # This is fresh session, initialize session and its variables
  43.                 $session->start();
  44.                 $lastSessionRequest time();
  45.                 $session->set('request_cnt'1);
  46.             } elseif ($fast_request_check && ($request_cnt $max_requests)) {
  47.                 # This is fast, consecutive request, but meets max requests limit
  48.                 $request_cnt++;
  49.             } elseif ($fast_request_check) {
  50.                 $url $request->server->get('SCRIPT_URL');
  51.                 if ($url) {
  52.                     throw new TooManyRequestsHttpException();
  53.                 }
  54.             } else {
  55.                 # This request is not fast, so reset session variables
  56.                 $lastSessionRequest time();
  57.                 $request_cnt 1;
  58.             }
  59.         }
  60.     }
  61.     public static function getSubscribedEvents(): array
  62.     {
  63.         return [
  64.             KernelEvents::REQUEST => 'onKernelRequest',
  65.         ];
  66.     }
  67. }