2009-08-14 6 views
8

프록시 서버를 통해 웹 사이트에 연결된 클라이언트의 IP 주소를 수집하는 방법이 있습니까?프록시를 통해 연결된 클라이언트의 IP 주소 찾기

전체 설정은 내부 LAN이고 sysadmin을 통해 프록시 시스템도 제어 할 수 있습니다. 웹 사이트 서버 측에 PHP5를 사용하고 있습니다.

PHP에서 $_SERVER['REMOTE_ADDR']을 시도했지만이 변수는 프록시의 IP 주소 만 저장합니다.

아이디어가 있으십니까?

답변

9

(PHP에서) 표준 솔루션입니다.

+4

실제로 이것은 작동하지 않습니다. 'HTTP_X_FORWARD_FOR'대신 'HTTP_X_FORWARDED_FOR' – lauhub

12

프록시에 따라 다릅니다. 일부 프록시는 원본 IP 주소 인 X-Forwarded-For 헤더를 제공하는 헤더를 추가하지만 대부분의 회사에서 프록시를 사용하여 희귀 한 내부 네트워크 구조를 숨길 수 있습니다. 이것이 사실이라면 당신은 쉽게 할 수 없을 것입니다.

프록시를 제어 할 수있는 경우 프록시 문서를 읽어 해당 헤더를 추가하는 방법을 확인하십시오.

+4

+1 정확하고 정교하게 설명됩니다. – karim79

+0

PHP는 XFF 헤더를 서버 변수로 구문 분석합니까? –

1

X-Forwarded-For은 클라이언트의 IP 주소를 얻는 유일한 방법입니다. 프록시에서 활성화 할 수있는 방법이 있는지 확인하십시오.

일부 프록시에서는 요청이 여러 프록시를 통과 할 때 기존 XFF 헤더를 처리하는 방법을 제공합니다. 여기에 고려해야 할 사항이 있습니다.

  1. 클라이언트 주소가 보안 또는 트러스트 목적 (예 : ACL 또는 속도 제한) 인 경우 기존 XFF 헤더는 프록시에 의해 삭제되어야합니다.
  2. 주소가 정보 용 (로깅, 디버깅) 전용 인 경우 기존 XFF에 쉼표로 구분 된 피어 주소를 추가해야합니다. 목록의 첫 번째 IP는 클라이언트의 IP입니다.

    if ($_SERVER['HTTP_X_FORWARDED_FOR']){ 
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    } 
    else{ 
        $ip = $_SERVER['REMOTE_ADDR']; 
    } 
    

    그러나 첫 번째 대답으로 모든 일이 실제로 설정되는 헤더에 따라 달라 말한다 :

0

이 코드는 프록시를 통해 연결하는 클라이언트의 IP 주소를 가져 오는 데 사용할 수 있습니다.

public static String getClientIpAddr(HttpServletRequest request) { 
    String ip = request.getHeader("X-Forwarded-For"); 

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("Proxy-Client-IP"); 
    } 

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("WL-Proxy-Client-IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_CLIENT_IP"); 
    } 

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
    } 

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getRemoteAddr(); 
    } 

    return ip; 
    } 

그러나 프록시가 투명 할 때만 감지합니다.

  1. 프록시 서버 사용하지 않음 : 아래

    는 HTTP 프록시에 대한 정보입니다 클라이언트
  2. request.getHeader("HTTP_X_FORWARDED_FOR")

    • request.getRemoteAddr() = IP 주소를 = 값 없음 또는 표시 없음
  3. 투명 프로 사용 xies : 클라이언트

  4. 를 사용하여 일반 익명 프록시의

    • HTTP_X_FORWARDED_FOR = 실제 IP 주소 : 프록시 서버의 프록시 서버의

      • request.getRemoteAddr() = IP 주소
      • HTTP_X_FORWARDED_FOR = IP 주소
+3

Ummm .. Java입니다. 질문이 PHP로 태그되었습니다. – StackOverflowed

관련 문제