<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\RateLimiter\RateLimiterFactory;
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
class CheckRequestSubscriber implements EventSubscriberInterface
{
private $anonymousApiLimiter;
public function __construct(RateLimiterFactory $anonymousApiLimiter)
{
$this->anonymousApiLimiter = $anonymousApiLimiter;
}
public function onKernelRequest(RequestEvent $event): void
{
//TODO :: remove cross site scripting(request value strip)
$request = $event->getRequest();
if ($event->getRequest()->getMethod() == 'GET' || $event->getRequest()->getMethod() == "POST") {
$input = $event->getRequest()->request->all();
array_walk_recursive($input, function (&$input) {
if (is_array($input)) {
array_walk_recursive($input, function (&$input) {
$input = strip_tags($input);
});
} else {
$input = strip_tags($input);
}
});
foreach ($input as $key => $data) {
$event->getRequest()->request->set($key, $data);
}
//TODO: 5 request per second
$time_interval = 300; #In seconds
$max_requests = 5; // TODO REQUEST 5
$session = $request->getSession();
$session->set('last_session_request', time());
$lastSessionRequest = $session->get('last_session_request');
$request_cnt = $session->get('request_cnt');
$fast_request_check = ($lastSessionRequest > time() - $time_interval);
if (!$request->hasSession()) {
# This is fresh session, initialize session and its variables
$session->start();
$lastSessionRequest = time();
$session->set('request_cnt', 1);
} elseif ($fast_request_check && ($request_cnt < $max_requests)) {
# This is fast, consecutive request, but meets max requests limit
$request_cnt++;
} elseif ($fast_request_check) {
$url = $request->server->get('SCRIPT_URL');
if ($url) {
throw new TooManyRequestsHttpException();
}
} else {
# This request is not fast, so reset session variables
$lastSessionRequest = time();
$request_cnt = 1;
}
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
}