Rack и доверенные IP-адреса - PullRequest
0 голосов
/ 10 января 2012

Я не эксперт по 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?, кажется, возвращается, если адрес принадлежит локальной сети (или даже моему собственному компьютеру).

Отклоняет ли он trusted_ips с forwarded_ips, потому что кажется, что я подделываю IP, делаязапрос извне, когда я в сети?

1 Ответ

1 голос
/ 10 января 2012

trusted_proxy? возвращает true, если ему доверяют, и да, похоже, что он возвращает true, только если это локальный адрес - что-то с 10.xxx или 172.xxx, адрес обратной связи (127.0.0.1) или localhost и т. Д.

Ниже он имеет remote_addrs.reject!, который берет коллекцию и удаляет из этой коллекции все, что находится в блоке true.Представьте, что у вас есть набор IP-адресов (сочетание локальных и удаленных) - этот блок принимает этот список IP-адресов, а отклоняет любой, который возвращает true с помощью метода trusted_proxy?, поэтому все, что вам нужноостались удаленные адреса.

Другими словами, он берет список IP-адресов и отклоняет локальные, оставляя вам только удаленные IP-адреса.

forwarded_ipsвыбираются на основе информации в заголовке HTTP_X_FORWARDED_FOR и т. д.

Наконец, блок, начинающийся с if client_ip, возвращает true, если список forwarded_ips включает client_ipfalse в противном случае.

В целом, и я немного догадываюсь об этой последней части, но я думаю, что цель метода ip состоит в том, чтобы в конечном итоге вернуть IP-адрес соединения или что-то ещев том и только в том случае, если это доверенный IP-адрес, который в противном случае не является попыткой подделки.Как я уже говорил, я не совсем уверен в этом, но метод ip, похоже, действует как последовательность фильтров на входе, чтобы дать вам что-то полезное в рамках цели этого метода.

...