2012-01-10 3 views
0

내가 랙 전문가가 아니에요, 그래서 Rack 1.4 source code에 출연 한 가지를 이해하지 못했다 :랙 및 신뢰할 수있는 IP를

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?이 주소가 속한 경우 반환 할 것 로컬 네트워크 (또는 심지어 내 컴퓨터).

forwarded_ips으로 trusted_ips을 거부합니까? 네트워크 내부에있을 때 외부에서 요청을하는 IP를 위조 한 것 같습니다. 이 신뢰할 않다면

답변

1

trusted_proxy? true를 반환하고, 예, 로컬 주소 인 경우에만 true를 돌려주는 것으로 보인다 - 뭔가를 10.xxx 또는 172.xxx, 루프백 주소 (127.0.0.1) 또는 localhost으로,

아래에는 컬렉션을 취한 블록이 true 인 컬렉션에서 제거되는 remote_addrs.reject!이 있습니다. IP 주소 모음 (로컬과 리모트가 혼합 된 것)을 가지고 있다고 가정 해보십시오. 해당 블록은 IP 주소 목록을 가져오고 을 거부합니다. trusted_proxy? 메서드를 통해 true를 반환하는 항목은 없습니다. 따라서 남은 것은 원격입니다. 구애.

다른 말로하면 IP 주소 목록을 가져와 로컬 IP 주소 목록을 거부하므로 원격 IP 만 남습니다.

forwarded_ips는 헤더 HTTP_X_FORWARDED_FOR의 정보에 기초하여 촬상되는 등

마지막 forwarded_ips리스트는 달리 client_ipfalse 포함하는 경우 if client_ip 복귀 true 시작 블록.

전반적으로이 마지막 부분을 약간 추측하고 있지만, ip 메서드의 목적은 궁극적으로 연결의 IP 주소 또는 무언가를 반환하는 것입니다. 신뢰할 수있는 IP 인 경우에만 그렇지 않으면 스푸핑 시도로 보이지 않습니다. 내가 그렇게 말한 것은 아니지만, ip 메서드는 그 메서드의 목적 범위 내에서 유용한 것을 돌려주기 위해 일련의 필터 역할을하는 것처럼 보입니다.

관련 문제