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:27 -0700 2008
commit  e21ed3e45429cf4a7ee4f5b6b550f457f0c4c313
tree    6b70ebc9d1d29a262166545146833d41d5f45651
parent  b23b19109050af04e2e1d0f57aee306463f4cbb9
...
135
136
137
138
139
140
 
141
 
 
 
 
142
143
144
...
135
136
137
 
 
 
138
139
140
141
142
143
144
145
146
0
@@ -135,10 +135,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'
...
12
13
14
 
 
 
15
16
17
...
12
13
14
15
16
17
18
19
20
0
@@ -12,6 +12,9 @@ class RequestTest < Test::Unit::TestCase
0
     @request.remote_addr = '1.2.3.4'
0
     assert_equal '1.2.3.4', @request.remote_ip
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
0
 

Comments