Skip to content

Commit af0b69a

Browse files
[8.x] Implement TrustProxies middleware (#38295)
* Implement TrustProxies middleware * Apply fixes from StyleCI * Remove abstract * Update TrustProxies.php Co-authored-by: Taylor Otwell <taylorotwell@users.noreply.github.com> Co-authored-by: Taylor Otwell <taylor@laravel.com>
1 parent d86e134 commit af0b69a

File tree

2 files changed

+503
-0
lines changed

2 files changed

+503
-0
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
3+
namespace Illuminate\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
8+
class TrustProxies
9+
{
10+
/**
11+
* The trusted proxies for the application.
12+
*
13+
* @var string|array|null
14+
*/
15+
protected $proxies;
16+
17+
/**
18+
* The proxy header mappings.
19+
*
20+
* @var int
21+
*/
22+
protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB;
23+
24+
/**
25+
* Handle an incoming request.
26+
*
27+
* @param \Illuminate\Http\Request $request
28+
* @param \Closure $next
29+
* @return mixed
30+
*
31+
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
32+
*/
33+
public function handle(Request $request, Closure $next)
34+
{
35+
$request::setTrustedProxies([], $this->getTrustedHeaderNames());
36+
37+
$this->setTrustedProxyIpAddresses($request);
38+
39+
return $next($request);
40+
}
41+
42+
/**
43+
* Sets the trusted proxies on the request.
44+
*
45+
* @param \Illuminate\Http\Request $request
46+
* @return void
47+
*/
48+
protected function setTrustedProxyIpAddresses(Request $request)
49+
{
50+
$trustedIps = $this->proxies;
51+
52+
if ($trustedIps === '*' || $trustedIps === '**') {
53+
return $this->setTrustedProxyIpAddressesToTheCallingIp($request);
54+
}
55+
56+
$trustedIps = is_string($trustedIps) ? array_map('trim', explode(',', $trustedIps)) : $trustedIps;
57+
58+
if (is_array($trustedIps)) {
59+
return $this->setTrustedProxyIpAddressesToSpecificIps($request, $trustedIps);
60+
}
61+
}
62+
63+
/**
64+
* Specify the IP addresses to trust explicitly.
65+
*
66+
* @param \Illuminate\Http\Request $request
67+
* @param array $trustedIps
68+
* @return void
69+
*/
70+
protected function setTrustedProxyIpAddressesToSpecificIps(Request $request, array $trustedIps)
71+
{
72+
$request->setTrustedProxies($trustedIps, $this->getTrustedHeaderNames());
73+
}
74+
75+
/**
76+
* Set the trusted proxy to be the IP address calling this servers.
77+
*
78+
* @param \Illuminate\Http\Request $request
79+
* @return void
80+
*/
81+
protected function setTrustedProxyIpAddressesToTheCallingIp(Request $request)
82+
{
83+
$request->setTrustedProxies([$request->server->get('REMOTE_ADDR')], $this->getTrustedHeaderNames());
84+
}
85+
86+
/**
87+
* Retrieve trusted header name(s), falling back to defaults if config not set.
88+
*
89+
* @return int A bit field of Request::HEADER_*, to set which headers to trust from your proxies.
90+
*/
91+
protected function getTrustedHeaderNames()
92+
{
93+
switch ($this->headers) {
94+
case 'HEADER_X_FORWARDED_AWS_ELB':
95+
case Request::HEADER_X_FORWARDED_AWS_ELB:
96+
return Request::HEADER_X_FORWARDED_AWS_ELB;
97+
break;
98+
case 'HEADER_FORWARDED':
99+
case Request::HEADER_FORWARDED:
100+
return Request::HEADER_FORWARDED;
101+
break;
102+
case 'HEADER_X_FORWARDED_FOR':
103+
case Request::HEADER_X_FORWARDED_FOR:
104+
return Request::HEADER_X_FORWARDED_FOR;
105+
break;
106+
case 'HEADER_X_FORWARDED_HOST':
107+
case Request::HEADER_X_FORWARDED_HOST:
108+
return Request::HEADER_X_FORWARDED_HOST;
109+
break;
110+
case 'HEADER_X_FORWARDED_PORT':
111+
case Request::HEADER_X_FORWARDED_PORT:
112+
return Request::HEADER_X_FORWARDED_PORT;
113+
break;
114+
case 'HEADER_X_FORWARDED_PROTO':
115+
case Request::HEADER_X_FORWARDED_PROTO:
116+
return Request::HEADER_X_FORWARDED_PROTO;
117+
break;
118+
default:
119+
return Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB;
120+
}
121+
122+
return $this->headers;
123+
}
124+
}

0 commit comments

Comments
 (0)