Просмотр файла app/Classes/CloudFlare.php

Размер файла: 2.1Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Classes;
  6.  
  7. use Closure;
  8. use Illuminate\Http\Request;
  9. use Symfony\Component\HttpFoundation\IpUtils;
  10.  
  11. class CloudFlare
  12. {
  13. /**
  14. * List of IP's used by CloudFlare.
  15. * @const array
  16. */
  17. protected const IPS = [
  18. '103.21.244.0/22',
  19. '103.22.200.0/22',
  20. '103.31.4.0/22',
  21. '104.16.0.0/13',
  22. '104.24.0.0/14',
  23. '108.162.192.0/18',
  24. '131.0.72.0/22',
  25. '141.101.64.0/18',
  26. '162.158.0.0/15',
  27. '172.64.0.0/13',
  28. '173.245.48.0/20',
  29. '188.114.96.0/20',
  30. '190.93.240.0/20',
  31. '197.234.240.0/22',
  32. '198.41.128.0/17',
  33. '2400:cb00::/32',
  34. '2405:8100::/32',
  35. '2405:b500::/32',
  36. '2606:4700::/32',
  37. '2803:f800::/32',
  38. '2c0f:f248::/32',
  39. '2a06:98c0::/29',
  40. ];
  41.  
  42. /**
  43. * @var Request
  44. */
  45. private $request;
  46.  
  47. public function __construct(Request $request)
  48. {
  49. $this->request = $request;
  50. }
  51.  
  52. /**
  53. * Checks if current request is coming from CloudFlare servers.
  54. *
  55. * @return bool
  56. */
  57. public function isTrustedRequest(): bool
  58. {
  59. return IpUtils::checkIp($this->request->ip(), static::IPS);
  60. }
  61.  
  62. /**
  63. * Executes a callback on a trusted request.
  64. *
  65. * @param Closure $callback
  66. *
  67. * @return mixed
  68. */
  69. public function onTrustedRequest(Closure $callback)
  70. {
  71. if ($this->isTrustedRequest()) {
  72. return $callback();
  73. }
  74. }
  75.  
  76. /**
  77. * Determines "the real" IP address from the current request.
  78. *
  79. * @return string
  80. */
  81. public function ip(): string
  82. {
  83. return $this->onTrustedRequest(function () {
  84. return filter_var($this->request->header('CF_CONNECTING_IP'), FILTER_VALIDATE_IP);
  85. }) ?: $this->request->ip();
  86. }
  87.  
  88. /**
  89. * Determines country from the current request.
  90. *
  91. * @return string
  92. */
  93. public function country(): string
  94. {
  95. return $this->onTrustedRequest(function () {
  96. return $this->request->header('CF_IPCOUNTRY');
  97. }) ?: '';
  98. }
  99. }