Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,14 @@ def webhook_endpoint(request):
is_verified = securenative.verify_request_payload(request)
```

## Extract proxy headers from Cloudflare
## Extract proxy headers from cloud providers

You can specify custom header keys to allow extraction of client ip from different providers.
This example demonstrates the usage of proxy headers for ip extraction from Cloudflare.

### Option 1: Using config file
```ini
SECURENATIVE_API_KEY: dsbe27fh3437r2yd326fg3fdg36f43
SECURENATIVE_API_KEY: "YOUR_API_KEY"
SECURENATIVE_PROXY_HEADERS: ["CF-Connecting-IP"]
```

Expand Down
268 changes: 268 additions & 0 deletions tests/request_utils_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,271 @@ def test_proxy_headers_extraction_from_request_multiple_ips(self):
client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_HTTP_X_FORWARDED_FOR_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"HTTP_X_FORWARDED_FOR": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_HTTP_X_FORWARDED_FOR_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"HTTP_X_FORWARDED_FOR": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_X_FORWARDED_FOR_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"X_FORWARDED_FOR": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_X_FORWARDED_FOR_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"X_FORWARDED_FOR": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_REMOTE_ADDR_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"REMOTE_ADDR": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_REMOTE_ADDR_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"REMOTE_ADDR": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_forwarded_for_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-forwarded-for": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_forwarded_for_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-forwarded-for": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_client_ip_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-client-ip": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_client_ip_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-client-ip": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_real_ip_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-real-ip": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_real_ip_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-real-ip": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_forwarded_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-forwarded": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_forwarded_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-forwarded": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_cluster_client_ip_for_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-cluster-client-ip": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_x_cluster_client_ip_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-client-ip": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_forwarded_for_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"forwarded-for": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_forwarded_for_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"forwarded-for": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_forwarded_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"forwarded": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_forwarded_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"forwarded": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_via_for_header_single_ip(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"via": "141.246.115.116"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_from_via_header_multiple_ips(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"via": "141.246.115.116, 203.0.113.1, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("141.246.115.116", client_ip)

def test_extraction_priority_with_x_forwarded_for(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-forwarded-for": "203.0.113.1",
"x-real-ip": "198.51.100.101",
"x-client-ip": "198.51.100.102"
}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("203.0.113.1", client_ip)

def test_extraction_priority_without_x_forwarded_for(self):
options = SecureNativeOptions()

with requests_mock.Mocker(real_http=True) as request:
request.headers = {
"x-real-ip": "198.51.100.101",
"x-client-ip": "203.0.113.1, 141.246.115.116, 12.34.56.3"}

client_ip = RequestUtils.get_client_ip_from_request(request, options)

self.assertEqual("203.0.113.1", client_ip)