[英]Rack and trusted IPs
我不是Rack专家,所以我不理解Rack 1.4源代码中出现的一件事:
def trusted_proxy?(ip)
ip =~ /^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|^::1$|^fd[0-9a-f]{2}:.+|^localhost$/i
end
def ip
remote_addrs = @env['REMOTE_ADDR'] ? @env['REMOTE_ADDR'].split(/[,\s]+/) : []
remote_addrs.reject! { |addr| trusted_proxy?(addr) }
return remote_addrs.first if remote_addrs.any?
forwarded_ips = @env['HTTP_X_FORWARDED_FOR'] ? @env['HTTP_X_FORWARDED_FOR'].strip.split(/[,\s]+/) : []
if client_ip = @env['HTTP_CLIENT_IP']
# If forwarded_ips doesn't include the client_ip, it might be an
# ip spoofing attempt, so we ignore HTTP_CLIENT_IP
return client_ip if forwarded_ips.include?(client_ip)
end
return forwarded_ips.reject { |ip| trusted_proxy?(ip) }.last || @env["REMOTE_ADDR"]
end
```
trusted_proxy?
如果该地址属于本地网络(甚至是我自己的计算机),似乎会返回。
它是否因为在网络内部时似乎是在伪造IP来执行外部请求而拒绝了带有forwarded_ips
trusted_ips
?
trusted_proxy?
如果受信任,则返回true;是的,似乎只有当它是本地地址时才返回true-带有10.xxx或172.xxx的东西,回送地址(127.0.0.1)或localhost
等。
在此之下,它具有remote_addrs.reject!
它获取一个集合,并从该集合中删除块中所有true
的内容。 假设您有一个IP地址集合(本地和远程)-该块所执行的操作是获取该IP地址列表,并拒绝任何通过trusted_proxy?
返回true的地址trusted_proxy?
方法,因此剩下的就是远程地址。
换句话说,它获取一个IP地址列表并拒绝本地IP地址,仅留下远程IP。
该forwarded_ips
是基于标头中的信息,拿起HTTP_X_FORWARDED_FOR
等。
最后,开头的块if client_ip
返回true
,如果列表forwarded_ips
包括client_ip
,和false
否则。
总的来说,我对这最后一部分有些猜测,但是我认为ip
方法的目的是最终返回连接的IP地址,或者仅当它是一个受信任的IP才返回的东西似乎是欺骗企图。 就像我说的那样,我不太确定,但是ip
方法似乎在输入上充当一系列过滤器,以便为您提供在该方法目的范围内有用的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.