簡體   English   中英

機架和可信IP

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM