2012-04-25 5 views
5

$_SERVER['REMOTE_ADDR], $_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['CLIENT_IP']에 의해 제공되는 IP 주소를 사용하는 많은 프로젝트가 있습니다.

IPV4 주소는 항상 같은 형식으로 수신하기 때문에 쉽게 일치합니다. 앞에 0이없는 4 개의 정수와 점 .으로 구분됩니다.

반면 IPV6 주소는 압축 될 수 있습니다. 예 : FF01 : 0 : 0 : 0 : 0 : 0 : 0 : 101 -> FF01 :: 101

이 문제를 조사 중이지만 관련성이 없으므로 사용자의 경험을 요청합니다. . $_SERVER['REMOTE_ADDR]은 표준을 사용하고 있습니까? 항상 압축되거나 압축되지 않은 상태로 수신 될 것이라고 가정하는 것이 안전합니까?

테스트를 시도하기 전에 모든 IPV6 문자열을 압축해야합니까?

참고 :

이상적으로는 데이터베이스/소스 코드의 가독성을 개선하고 쉽게 IP 범위 매칭을 할 수 있도록, IPV6 오히려 바이너리 구조보다는 문자열로 주소를 처리하고 싶습니다.

+0

저는 IPv6로 작업하지는 않았지만, 조작하려는 모든 주소를 inet_pton()해야한다고 생각합니다. –

+0

@ ÁlvaroG.Vicario 코멘트 주셔서 감사 드리며,이 기능을 확실히 살펴 보겠습니다. 하지만 가능한 경우 문자열 표기법을 사용하고 싶습니다. – Tchoupi

답변

5

inet_pton()을 먼저 사용한 다음 inet_ntop() 문자열로 다시 변환하면 일관된 문자열 표현이 있어야합니다. 일관성있게 입력에 의존하지 않을 것입니다 ...

+1

나는 그것을 테스트했고 일관된 결과를주는 것으로 보인다. 이것은 정확하게 내가 원하는 것일 수 있습니다. 실생활 프로젝트에서 작동 여부를 확인하기 위해 테스트 할 것입니다. – Tchoupi

+0

테스트를 통해 완벽하게 작동합니다. 그리고 그것은 충분히 간단합니다. 감사! – Tchoupi

+1

@Sander [inet_pton()] (http://php.net/manual/en/function.inet-pton.php) 및 [inet_ntop()] (http://php.net/manual/en/function. inet-ntop.php) ... 대답에이 링크를 넣을 수 있습니까? –

1

권장 주소는 RFC 5952입니다.

그러나 모든 주소를 해당 형식으로 사용할 수는 없으며 문자열 형식은 범위 비교에 특히 적합하지 않습니다. RFC를 읽으면 동일한 IPv6 주소를 합법적으로 나타낼 수있는 방법을 몇 가지로 알 수 있습니다.

실제로 주소를 구문 분석하고 (다른 곳에서 언급 한대로 inet_pton 사용) 결과 128 비트 필드에서 범위 비교를 수행해야합니다.

종종 대부분의 아키텍처에서 long으로 잘 맞는 64 개의 최상위 비트에만 신경을 쓰는 경우가 많습니다.

1

CGI spec는 RFC 호환 IPv6 주소가 유효한지 분명하다

4.1.8. REMOTE_ADDR 

    The REMOTE_ADDR variable MUST be set to the network address of the 
    client sending the request to the server. 

     REMOTE_ADDR = hostnumber 
     hostnumber = ipv4-address | ipv6-address 
     ipv4-address = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit 
     ipv6-address = hexpart [ ":" ipv4-address ] 
     hexpart  = hexseq | ([ hexseq ] "::" [ hexseq ]) 
     hexseq  = 1*4hex *(":" 1*4hex) 

    The format of an IPv6 address is described in RFC 3513 [15]. 

제정신이 프로그래머가 모든 입력의 유효성을 검사합니다. 따라서 모든 환경 변수를 감염된 입력으로 처리하고 유효성을 검사하거나 변환해야합니다. X-Forward-For 외 클라이언트가 제공 한 헤더는 항상 의심 받아야합니다.

그렇다면 IPv6 주소를 확장하는 것은 어떨까요?

이 질문은 been asked beforethere are several solutionsa PEAR one

이 도움이 희망 등이있다!

+0

감사합니다.물론 유효한 IP인지 확인합니다. 사실 저는 http://stackoverflow.com/questions/444966/working-with-ipv6-addresses-in-php에 제공된 함수를 사용하여 IPV4 및 IPV6을 데이터베이스에 저장합니다. PEAR 솔루션은 좋은 솔루션처럼 보입니다. 확실히해볼 것입니다. – Tchoupi

+0

심지어 배 기능이 IPv6에서 문자열 형식으로 (심지어 완전히 확장 된) IPv6에서 범위 일치를 시도하면 매우 어렵습니다. 특히 범위가 니블 경계 (즉,/62)에 있지 않으면 – Alnitak

+0

@Alnitak Good 포인트. 내 IP 범위를 니블 경계로 줄일 수 있으므로 일관된 입력이 있다고 가정하면 간단한 'strpos'가 트릭을 수행해야합니다. – Tchoupi