api de gestion de ticket, basé sur php-crud-api. Le but est de décorrélé les outils de gestion des données, afin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FirewallMiddleware.php 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Middleware;
  3. use Psr\Http\Message\ResponseInterface;
  4. use Psr\Http\Message\ServerRequestInterface;
  5. use Psr\Http\Server\RequestHandlerInterface;
  6. use Tqdev\PhpCrudApi\Controller\Responder;
  7. use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
  8. use Tqdev\PhpCrudApi\Record\ErrorCode;
  9. class FirewallMiddleware extends Middleware
  10. {
  11. private function ipMatch(string $ip, string $cidr): bool
  12. {
  13. if (strpos($cidr, '/') !== false) {
  14. list($subnet, $mask) = explode('/', trim($cidr));
  15. if ((ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
  16. return true;
  17. }
  18. } else {
  19. if (ip2long($ip) == ip2long($cidr)) {
  20. return true;
  21. }
  22. }
  23. return false;
  24. }
  25. private function isIpAllowed(string $ipAddress, string $allowedIpAddresses): bool
  26. {
  27. foreach (explode(',', $allowedIpAddresses) as $allowedIp) {
  28. if ($this->ipMatch($ipAddress, $allowedIp)) {
  29. return true;
  30. }
  31. }
  32. return false;
  33. }
  34. public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
  35. {
  36. $reverseProxy = $this->getProperty('reverseProxy', '');
  37. if ($reverseProxy) {
  38. $ipAddress = array_pop(explode(',', $request->getHeader('X-Forwarded-For')));
  39. } elseif (isset($_SERVER['REMOTE_ADDR'])) {
  40. $ipAddress = $_SERVER['REMOTE_ADDR'];
  41. } else {
  42. $ipAddress = '127.0.0.1';
  43. }
  44. $allowedIpAddresses = $this->getProperty('allowedIpAddresses', '');
  45. if (!$this->isIpAllowed($ipAddress, $allowedIpAddresses)) {
  46. $response = $this->responder->error(ErrorCode::TEMPORARY_OR_PERMANENTLY_BLOCKED, '');
  47. } else {
  48. $response = $next->handle($request);
  49. }
  50. return $response;
  51. }
  52. }