Skip to content

Commit 29580a6

Browse files
JTCunningmattrobenolt
authored andcommitted
Strip ports from IPv4-only IPs. (#3421)
* Add a period to the IP checker to ensure it only finds IPv4. * Add a test case for both IP versions. * IPv4 is still the most popular but it's 2016. :sadface:
1 parent db24074 commit 29580a6

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

src/sentry/middleware/proxy.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ def process_request(self, request):
1111
# HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs.
1212
# Take just the first one.
1313
real_ip = real_ip.split(",")[0]
14-
if ':' in real_ip:
14+
if ':' in real_ip and '.' in real_ip:
15+
# Strip the port number off of an IPv4 FORWARDED_FOR entry.
1516
real_ip = real_ip.split(':', 1)[0]
1617
request.META['REMOTE_ADDR'] = real_ip
1718

tests/sentry/middleware/test_proxy.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from __future__ import absolute_import
22

33
from exam import fixture
4-
from django.http import HttpResponse, StreamingHttpResponse
4+
from django.http import HttpRequest, HttpResponse, StreamingHttpResponse
55

66
from sentry.testutils import TestCase
7-
from sentry.middleware.proxy import ContentLengthHeaderMiddleware
7+
from sentry.middleware.proxy import (
8+
ContentLengthHeaderMiddleware, SetRemoteAddrFromForwardedFor)
89

910

1011
class ContentLengthHeaderMiddlewareTest(TestCase):
@@ -19,3 +20,19 @@ def test_streaming(self):
1920
response = self.middleware.process_response(None, StreamingHttpResponse())
2021
assert 'Transfer-Encoding' not in response
2122
assert 'Content-Length' not in response
23+
24+
25+
class SetRemoteAddrFromForwardedForTestCase(TestCase):
26+
middleware = fixture(SetRemoteAddrFromForwardedFor)
27+
28+
def test_ipv4(self):
29+
request = HttpRequest()
30+
request.META['HTTP_X_FORWARDED_FOR'] = '8.8.8.8:80,8.8.4.4'
31+
self.middleware.process_request(request)
32+
assert request.META['REMOTE_ADDR'] == '8.8.8.8'
33+
34+
def test_ipv6(self):
35+
request = HttpRequest()
36+
request.META['HTTP_X_FORWARDED_FOR'] = '2001:4860:4860::8888,2001:4860:4860::8844'
37+
self.middleware.process_request(request)
38+
assert request.META['REMOTE_ADDR'] == '2001:4860:4860::8888'

0 commit comments

Comments
 (0)