public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Request#remote_ip handles the uncommon case that REMOTE_ADDR is a 
comma-separated list.

[#523 state:resolved]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
Tue Jul 01 01:52:20 -0700 2008
jeremy (committer)
Wed Aug 27 23:03:11 -0700 2008
commit  e42a235dd18a39ccc83382365088de96f24fa236
tree    b3b2ecd628fa70ab6fbc8ec0649d6b044b2f285d
parent  c2068d14d29ec767c681798b3814f0a8e22fb0ff
...
197
198
199
200
201
202
 
203
 
 
 
 
204
205
206
...
197
198
199
 
 
 
200
201
202
203
204
205
206
207
208
0
@@ -197,10 +197,12 @@ module ActionController
0
     # delimited list in the case of multiple chained proxies; the last
0
     # address which is not trusted is the originating IP.
0
     def remote_ip
0
-      if TRUSTED_PROXIES !~ @env['REMOTE_ADDR']
0
-        return @env['REMOTE_ADDR']
0
-      end
0
+      remote_addr_list = @env['REMOTE_ADDR'] && @env['REMOTE_ADDR'].split(',').collect(&:strip)
0
 
0
+      unless remote_addr_list.blank?
0
+        not_trusted_addrs = remote_addr_list.reject {|addr| addr =~ TRUSTED_PROXIES}
0
+        return not_trusted_addrs.first unless not_trusted_addrs.empty?
0
+      end
0
       remote_ips = @env['HTTP_X_FORWARDED_FOR'] && @env['HTTP_X_FORWARDED_FOR'].split(',')
0
 
0
       if @env.include? 'HTTP_CLIENT_IP'
...
17
18
19
 
 
 
20
21
22
...
17
18
19
20
21
22
23
24
25
0
@@ -17,6 +17,9 @@ class RequestTest < Test::Unit::TestCase
0
     @request.remote_addr = '1.2.3.4'
0
     assert_equal '1.2.3.4', @request.remote_ip(true)
0
 
0
+    @request.remote_addr = '1.2.3.4,3.4.5.6'
0
+    assert_equal '1.2.3.4', @request.remote_ip(true)
0
+
0
     @request.env['HTTP_CLIENT_IP'] = '2.3.4.5'
0
     assert_equal '1.2.3.4', @request.remote_ip(true)
0
 

Comments