|
@@ -549,357 +549,188 @@ class RequestTest extends \Test\TestCase {
|
|
|
$this->assertEquals('3', $request->getParams()['id']);
|
|
|
}
|
|
|
|
|
|
- public function testGetRemoteAddressWithoutTrustedRemote() {
|
|
|
- $this->config
|
|
|
- ->expects($this->once())
|
|
|
- ->method('getSystemValue')
|
|
|
- ->with('trusted_proxies')
|
|
|
- ->willReturn([]);
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
+ public function dataGetRemoteAddress(): array {
|
|
|
+ return [
|
|
|
+ 'IPv4 without trusted remote' => [
|
|
|
+ [
|
|
|
'REMOTE_ADDR' => '10.0.0.2',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
+ [],
|
|
|
+ [],
|
|
|
+ '10.0.0.2',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('10.0.0.2', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressWithNoTrustedHeader() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->withConsecutive(
|
|
|
- ['trusted_proxies'],
|
|
|
- ['forwarded_for_headers'],
|
|
|
- )->willReturnOnConsecutiveCalls(
|
|
|
- ['10.0.0.2'],
|
|
|
- []
|
|
|
- );
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
+ 'IPv4 without trusted headers' => [
|
|
|
+ [
|
|
|
'REMOTE_ADDR' => '10.0.0.2',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
+ ['10.0.0.2'],
|
|
|
+ [],
|
|
|
+ '10.0.0.2',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('10.0.0.2', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressWithSingleTrustedRemote() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->withConsecutive(
|
|
|
- ['trusted_proxies'],
|
|
|
- ['forwarded_for_headers'],
|
|
|
- )-> willReturnOnConsecutiveCalls(
|
|
|
+ 'IPv4 with single trusted remote' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '10.0.0.2',
|
|
|
+ 'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
+ ],
|
|
|
['10.0.0.2'],
|
|
|
['HTTP_X_FORWARDED'],
|
|
|
- );
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
- 'REMOTE_ADDR' => '10.0.0.2',
|
|
|
+ '10.4.0.4',
|
|
|
+ ],
|
|
|
+ 'IPv6 with single trusted remote' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
+ ['2001:db8:85a3:8d3:1319:8a2e:370:7348'],
|
|
|
+ ['HTTP_X_FORWARDED'],
|
|
|
+ '10.4.0.4',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('10.4.0.4', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressWithMultipleTrustedRemotes() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->willReturnMap([
|
|
|
- ['trusted_proxies', [], ['10.0.0.2', '::1']],
|
|
|
- ['forwarded_for_headers', ['HTTP_X_FORWARDED_FOR'], ['HTTP_X_FORWARDED']],
|
|
|
- ]);
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
+ 'IPv4 with multiple trusted remotes' => [
|
|
|
+ [
|
|
|
'REMOTE_ADDR' => '10.0.0.2',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4, ::1',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
- ],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('10.4.0.4', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressIPv6WithSingleTrustedRemote() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->withConsecutive(
|
|
|
- ['trusted_proxies'],
|
|
|
- ['forwarded_for_headers'],
|
|
|
- )-> willReturnOnConsecutiveCalls(
|
|
|
- ['2001:db8:85a3:8d3:1319:8a2e:370:7348'],
|
|
|
+ ['10.0.0.2', '::1'],
|
|
|
['HTTP_X_FORWARDED'],
|
|
|
- );
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
- 'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
+ '10.4.0.4',
|
|
|
+ ],
|
|
|
+ 'IPv4 order of forwarded-for headers' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '10.0.0.2',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
- ],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('10.4.0.4', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressVerifyPriorityHeader() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->withConsecutive(
|
|
|
- ['trusted_proxies'],
|
|
|
- ['forwarded_for_headers'],
|
|
|
- )-> willReturnOnConsecutiveCalls(
|
|
|
['10.0.0.2'],
|
|
|
[
|
|
|
'HTTP_X_FORWARDED',
|
|
|
'HTTP_X_FORWARDED_FOR',
|
|
|
'HTTP_CLIENT_IP',
|
|
|
],
|
|
|
- );
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
+ '192.168.0.233',
|
|
|
+ ],
|
|
|
+ 'IPv4 order of forwarded-for headers (reversed)' => [
|
|
|
+ [
|
|
|
'REMOTE_ADDR' => '10.0.0.2',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
+ ['10.0.0.2'],
|
|
|
+ [
|
|
|
+ 'HTTP_CLIENT_IP',
|
|
|
+ 'HTTP_X_FORWARDED_FOR',
|
|
|
+ 'HTTP_X_FORWARDED',
|
|
|
+ ],
|
|
|
+ '10.4.0.4',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('192.168.0.233', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressIPv6VerifyPriorityHeader() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->withConsecutive(
|
|
|
- ['trusted_proxies'],
|
|
|
- ['forwarded_for_headers'],
|
|
|
- )-> willReturnOnConsecutiveCalls(
|
|
|
+ 'IPv6 order of forwarded-for headers' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
+ 'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
+ ],
|
|
|
['2001:db8:85a3:8d3:1319:8a2e:370:7348'],
|
|
|
[
|
|
|
'HTTP_X_FORWARDED',
|
|
|
'HTTP_X_FORWARDED_FOR',
|
|
|
'HTTP_CLIENT_IP',
|
|
|
],
|
|
|
- );
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
- 'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
+ '192.168.0.233',
|
|
|
+ ],
|
|
|
+ 'IPv4 matching CIDR of trusted proxy' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '192.168.3.99',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
- ],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('192.168.0.233', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressWithMatchingCidrTrustedRemote() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->withConsecutive(
|
|
|
- ['trusted_proxies'],
|
|
|
- ['forwarded_for_headers'],
|
|
|
- )-> willReturnOnConsecutiveCalls(
|
|
|
['192.168.2.0/24'],
|
|
|
['HTTP_X_FORWARDED_FOR'],
|
|
|
- );
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
- 'REMOTE_ADDR' => '192.168.2.99',
|
|
|
- 'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
- ],
|
|
|
+ '192.168.3.99',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('192.168.0.233', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressWithNotMatchingCidrTrustedRemote() {
|
|
|
- $this->config
|
|
|
- ->expects($this->once())
|
|
|
- ->method('getSystemValue')
|
|
|
- ->with('trusted_proxies')
|
|
|
- ->willReturn(['192.168.2.0/24']);
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
- 'REMOTE_ADDR' => '192.168.3.99',
|
|
|
+ 'IPv6 matching CIDR of trusted proxy' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a21:370:7348',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
- ],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('192.168.3.99', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteIpv6AddressWithMatchingIpv6CidrTrustedRemote() {
|
|
|
- $this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
- ->method('getSystemValue')
|
|
|
- ->withConsecutive(
|
|
|
- ['trusted_proxies'],
|
|
|
- ['forwarded_for_headers']
|
|
|
- )->willReturnOnConsecutiveCalls(
|
|
|
['2001:db8:85a3:8d3:1319:8a20::/95'],
|
|
|
- ['HTTP_X_FORWARDED_FOR']
|
|
|
- );
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
- 'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a21:370:7348',
|
|
|
+ ['HTTP_X_FORWARDED_FOR'],
|
|
|
+ '192.168.0.233',
|
|
|
+ ],
|
|
|
+ 'IPv6 not matching CIDR of trusted proxy' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
+ ['fd::/8'],
|
|
|
+ [],
|
|
|
+ '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('192.168.0.233', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressIpv6WithNotMatchingCidrTrustedRemote() {
|
|
|
- $this->config
|
|
|
- ->expects($this->once())
|
|
|
- ->method('getSystemValue')
|
|
|
- ->with('trusted_proxies')
|
|
|
- ->willReturn(['fd::/8']);
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
+ 'IPv6 with invalid trusted proxy' => [
|
|
|
+ [
|
|
|
'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.233',
|
|
|
],
|
|
|
+ ['fx::/8'],
|
|
|
+ [],
|
|
|
+ '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('2001:db8:85a3:8d3:1319:8a2e:370:7348', $request->getRemoteAddress());
|
|
|
- }
|
|
|
-
|
|
|
- public function testGetRemoteAddressIpv6WithInvalidTrustedProxy() {
|
|
|
- $this->config
|
|
|
- ->expects($this->once())
|
|
|
- ->method('getSystemValue')
|
|
|
- ->with('trusted_proxies')
|
|
|
- ->willReturn(['fx::/8']);
|
|
|
-
|
|
|
- $request = new Request(
|
|
|
- [
|
|
|
- 'server' => [
|
|
|
+ 'IPv4 forwarded for IPv6' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '192.168.2.99',
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '[2001:db8:85a3:8d3:1319:8a2e:370:7348]',
|
|
|
+ ],
|
|
|
+ ['192.168.2.0/24'],
|
|
|
+ ['HTTP_X_FORWARDED_FOR'],
|
|
|
+ '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
+ ],
|
|
|
+ 'IPv4 with port' => [
|
|
|
+ [
|
|
|
'REMOTE_ADDR' => '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
- 'HTTP_X_FORWARDED' => '10.4.0.5, 10.4.0.4',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '192.168.0.233'
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '192.168.2.99:8080',
|
|
|
],
|
|
|
+ ['2001:db8::/8'],
|
|
|
+ ['HTTP_X_FORWARDED_FOR'],
|
|
|
+ '192.168.2.99',
|
|
|
],
|
|
|
- $this->requestId,
|
|
|
- $this->config,
|
|
|
- $this->csrfTokenManager,
|
|
|
- $this->stream
|
|
|
- );
|
|
|
-
|
|
|
- $this->assertSame('2001:db8:85a3:8d3:1319:8a2e:370:7348', $request->getRemoteAddress());
|
|
|
+ 'IPv6 with port' => [
|
|
|
+ [
|
|
|
+ 'REMOTE_ADDR' => '192.168.2.99',
|
|
|
+ 'HTTP_X_FORWARDED_FOR' => '[2001:db8:85a3:8d3:1319:8a2e:370:7348]:8080',
|
|
|
+ ],
|
|
|
+ ['192.168.2.0/24'],
|
|
|
+ ['HTTP_X_FORWARDED_FOR'],
|
|
|
+ '2001:db8:85a3:8d3:1319:8a2e:370:7348',
|
|
|
+ ],
|
|
|
+ ];
|
|
|
}
|
|
|
|
|
|
- public function testGetRemoteAddressWithXForwardedForIPv6() {
|
|
|
+ /**
|
|
|
+ * @dataProvider dataGetRemoteAddress
|
|
|
+ */
|
|
|
+ public function testGetRemoteAddress(array $headers, array $trustedProxies, array $forwardedForHeaders, string $expected): void {
|
|
|
$this->config
|
|
|
- ->expects($this->exactly(2))
|
|
|
->method('getSystemValue')
|
|
|
->withConsecutive(
|
|
|
['trusted_proxies'],
|
|
|
['forwarded_for_headers'],
|
|
|
- )-> willReturnOnConsecutiveCalls(
|
|
|
- ['192.168.2.0/24'],
|
|
|
- ['HTTP_X_FORWARDED_FOR'],
|
|
|
+ )
|
|
|
+ ->willReturnOnConsecutiveCalls(
|
|
|
+ $trustedProxies,
|
|
|
+ $forwardedForHeaders,
|
|
|
);
|
|
|
|
|
|
$request = new Request(
|
|
|
[
|
|
|
- 'server' => [
|
|
|
- 'REMOTE_ADDR' => '192.168.2.99',
|
|
|
- 'HTTP_X_FORWARDED_FOR' => '[2001:db8:85a3:8d3:1319:8a2e:370:7348]',
|
|
|
- ],
|
|
|
+ 'server' => $headers,
|
|
|
],
|
|
|
$this->requestId,
|
|
|
$this->config,
|
|
@@ -907,7 +738,7 @@ class RequestTest extends \Test\TestCase {
|
|
|
$this->stream
|
|
|
);
|
|
|
|
|
|
- $this->assertSame('2001:db8:85a3:8d3:1319:8a2e:370:7348', $request->getRemoteAddress());
|
|
|
+ $this->assertSame($expected, $request->getRemoteAddress());
|
|
|
}
|
|
|
|
|
|
/**
|