TrustProxies.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace Fideloper\Proxy;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Contracts\Config\Repository;
  6. class TrustProxies
  7. {
  8. /**
  9. * The config repository instance.
  10. *
  11. * @var \Illuminate\Contracts\Config\Repository
  12. */
  13. protected $config;
  14. /**
  15. * The trusted proxies for the application.
  16. *
  17. * @var null|string|array
  18. */
  19. protected $proxies;
  20. /**
  21. * The proxy header mappings.
  22. *
  23. * @var null|string|int
  24. */
  25. protected $headers;
  26. /**
  27. * Create a new trusted proxies middleware instance.
  28. *
  29. * @param \Illuminate\Contracts\Config\Repository $config
  30. */
  31. public function __construct(Repository $config)
  32. {
  33. $this->config = $config;
  34. }
  35. /**
  36. * Handle an incoming request.
  37. *
  38. * @param \Illuminate\Http\Request $request
  39. * @param \Closure $next
  40. *
  41. * @throws \Symfony\Component\HttpKernel\Exception\HttpException
  42. *
  43. * @return mixed
  44. */
  45. public function handle(Request $request, Closure $next)
  46. {
  47. $request::setTrustedProxies([], $this->getTrustedHeaderNames()); // Reset trusted proxies between requests
  48. $this->setTrustedProxyIpAddresses($request);
  49. return $next($request);
  50. }
  51. /**
  52. * Sets the trusted proxies on the request to the value of trustedproxy.proxies
  53. *
  54. * @param \Illuminate\Http\Request $request
  55. */
  56. protected function setTrustedProxyIpAddresses(Request $request)
  57. {
  58. $trustedIps = $this->proxies ?: $this->config->get('trustedproxy.proxies');
  59. // Trust any IP address that calls us
  60. // `**` for backwards compatibility, but is deprecated
  61. if ($trustedIps === '*' || $trustedIps === '**') {
  62. return $this->setTrustedProxyIpAddressesToTheCallingIp($request);
  63. }
  64. // Support IPs addresses separated by comma
  65. $trustedIps = is_string($trustedIps) ? array_map('trim', explode(',', $trustedIps)) : $trustedIps;
  66. // Only trust specific IP addresses
  67. if (is_array($trustedIps)) {
  68. return $this->setTrustedProxyIpAddressesToSpecificIps($request, $trustedIps);
  69. }
  70. }
  71. /**
  72. * Specify the IP addresses to trust explicitly.
  73. *
  74. * @param \Illuminate\Http\Request $request
  75. * @param array $trustedIps
  76. */
  77. private function setTrustedProxyIpAddressesToSpecificIps(Request $request, $trustedIps)
  78. {
  79. $request->setTrustedProxies((array) $trustedIps, $this->getTrustedHeaderNames());
  80. }
  81. /**
  82. * Set the trusted proxy to be the IP address calling this servers
  83. *
  84. * @param \Illuminate\Http\Request $request
  85. */
  86. private function setTrustedProxyIpAddressesToTheCallingIp(Request $request)
  87. {
  88. $request->setTrustedProxies([$request->server->get('REMOTE_ADDR')], $this->getTrustedHeaderNames());
  89. }
  90. /**
  91. * Retrieve trusted header name(s), falling back to defaults if config not set.
  92. *
  93. * @return int A bit field of Request::HEADER_*, to set which headers to trust from your proxies.
  94. */
  95. protected function getTrustedHeaderNames()
  96. {
  97. $headers = $this->headers ?: $this->config->get('trustedproxy.headers');
  98. switch ($headers) {
  99. case 'HEADER_X_FORWARDED_AWS_ELB':
  100. case Request::HEADER_X_FORWARDED_AWS_ELB:
  101. return Request::HEADER_X_FORWARDED_AWS_ELB;
  102. break;
  103. case 'HEADER_FORWARDED':
  104. case Request::HEADER_FORWARDED:
  105. return Request::HEADER_FORWARDED;
  106. break;
  107. case 'HEADER_X_FORWARDED_ALL':
  108. case Request::HEADER_X_FORWARDED_ALL:
  109. return Request::HEADER_X_FORWARDED_ALL;
  110. break;
  111. }
  112. return $headers;
  113. }
  114. }