[英]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.