Skip to content

Commit 6f8c7c2

Browse files
author
Inbal Tako
committed
Support ipv6 extraction
1 parent 27707bc commit 6f8c7c2

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

lib/securenative/utils/request_utils.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,18 @@ def self.get_client_ip_from_request(request, options)
4949

5050
begin
5151
x_forwarded_for = request.env['HTTP_X_FORWARDED_FOR']
52+
if ip.include? ','
53+
x_forwarded_for = ip.split(',')[0]
54+
end
5255
if self.validate_ip(x_forwarded_for)
5356
return x_forwarded_for
5457
end
5558
rescue NoMethodError
5659
begin
5760
x_forwarded_for = request['HTTP_X_FORWARDED_FOR']
61+
if ip.include? ','
62+
x_forwarded_for = ip.split(',')[0]
63+
end
5864
if self.validate_ip(x_forwarded_for)
5965
return x_forwarded_for
6066
end
@@ -65,12 +71,18 @@ def self.get_client_ip_from_request(request, options)
6571

6672
begin
6773
x_forwarded_for = request.env['HTTP_X_REAL_IP']
74+
if ip.include? ','
75+
x_forwarded_for = ip.split(',')[0]
76+
end
6877
if self.validate_ip(x_forwarded_for)
6978
return x_forwarded_for
7079
end
7180
rescue NoMethodError
7281
begin
7382
x_forwarded_for = request['HTTP_X_REAL_IP']
83+
if ip.include? ','
84+
x_forwarded_for = ip.split(',')[0]
85+
end
7486
if self.validate_ip(x_forwarded_for)
7587
return x_forwarded_for
7688
end
@@ -81,12 +93,18 @@ def self.get_client_ip_from_request(request, options)
8193

8294
begin
8395
x_forwarded_for = request.env['REMOTE_ADDR']
96+
if ip.include? ','
97+
x_forwarded_for = ip.split(',')[0]
98+
end
8499
if self.validate_ip(x_forwarded_for)
85100
return x_forwarded_for
86101
end
87102
rescue NoMethodError
88103
begin
89104
x_forwarded_for = request['REMOTE_ADDR']
105+
if ip.include? ','
106+
x_forwarded_for = ip.split(',')[0]
107+
end
90108
if self.validate_ip(x_forwarded_for)
91109
return x_forwarded_for
92110
end
@@ -119,6 +137,9 @@ def self.parse_ip(headers)
119137

120138
def self.parse_proxy_header(headers, header_key)
121139
h = headers.gsub(header_key + ': ', '')
140+
if headers.include? ','
141+
h = h.split(',')[0]
142+
end
122143
return h
123144
end
124145

spec/securenative/utils/spec_request_utils.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,23 @@
4242

4343
expect(client_ip).to eq('f71f:5bf9:25ff:1883:a8c4:eeff:7b80:aa2d')
4444
end
45+
46+
it 'extract a request with proxy headers multiple ipv4' do
47+
options = SecureNative::Options.new
48+
options.proxy_headers = [
49+
'CF-Connecting-IP'
50+
]
51+
52+
stub_request(:get, 'http://www.example.com/')
53+
.with(headers: {
54+
'Accept' => '*/*',
55+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
56+
'User-Agent' => 'Ruby'
57+
}).to_return(status: 200, body: '', headers: { 'CF-Connecting-IP' => 'CF-Connecting-IP: 141.246.115.116, 203.0.113.1, 12.34.56.3' })
58+
59+
request = Net::HTTP.get_response('www.example.com', '/')
60+
client_ip = SecureNative::Utils::RequestUtils.get_client_ip_from_request(request, options)
61+
62+
expect(client_ip).to eq('141.246.115.116')
63+
end
4564
end

0 commit comments

Comments
 (0)