2008-10-03 286 views
361

나는 PHP에서 $_SERVER["REMOTE_ADDR"]에 의해 반환 된 데이터를 DB 필드에 넣고 싶습니다. 매우 간단한 작업입니다. 문제는 웹 주소가 $_SERVER["REMOTE_ADDR"]을 통해 제공되는 텍스트 표현 (IPv6 주소)의 최대 길이에 대한 적절한 정보를 찾을 수 없다는 것입니다.IPv6 주소의 텍스트 표현의 최대 길이는 어느 정도입니까?

주소가 보통 인코딩되는 128 비트로 텍스트 표현을 변환하는 데 관심이 없습니다. $_SERVER["REMOTE_ADDR"]이 반환 한 IPv6 주소를 저장하는 데 최대 문자 수를 알아야합니다.

+6

존 인덱스는 어떻게됩니까? –

+2

#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48) – xxwatcherxx

+0

출처 : lxr.free-electrons.com/source/include/linux/inet.h – xxwatcherxx

답변

504

약간 잘못된, 순진 옵션은 다음과 같습니다 (7)와 4 자리의

8 * 4 + 7 = 39

8 그룹 ':'사이.

하지만 IPv4 매핑 된 IPv6 주소 기능을 고려해야합니다 (예 : [::ffff:192.168.0.1]을 완전히 써 :

(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45

주,이 입력은/디스플레이 관습 - 데이터의 양이 동일하고 저장을 위해 원시 콜론으로 분리 된 포맷으로 표준화하는 것이 가장 좋습니다. 위의 주소는 [0000:0000:0000:0000:ffff:7fa8:0001]입니다.

+14

0000 : 0000 : 0000 : 0000 : 0000 : 0000 : 127.127.127.127 여기에서 읽었을 때 http://tools.ietf.org/html/rfc4291이 유효 할 수 있습니다. 그리고 이것은 45 자입니다. – Vili

+215

헤더 파일은 INET6_ADDRSTRLEN을 46으로 정의합니다.이 문자는 45 개의 문자와 함께 후행 null을 더한 것입니다. – wisnij

+28

안전하고 멋지게 만들기 위해 50 자. – Sophivorus

15

내 자신의 질문에 대답 :

IPv6 주소는 일반적으로 각 그룹은 콜론 (:)으로 구분 된 4 개의 16 진수의 8 개 그룹으로 기록됩니다.

최대 39 자입니다.

+3

그러나 분명히 경고가 있습니다. http://stackoverflow.com/a/7477384/3787376 ("클라이언트 IP 주소의 최대 길이") - 인용 : "IPv4 매핑 IPv6 주소의 경우 문자열은 39자를 초과 할 수 있습니다. ". "IPv4로 매핑 된 IPv6"은 45 자이며 "NNNN : NNNN : NNNN : NNNN : NNNN : NNNN : 192.168.158.190"형식으로되어 있습니다. 따라서 최대 값은 45 자 여야합니다. http://stackoverflow.com/a/166157/3787376 (이 질문)의 대답도이 점을 입증하는 것 같습니다. – Edward

7

이 링크의 @Deepak 대답은 정답과 더 가깝다고 생각합니다. Max length for client ip address. 올바른 크기는 45가 아니라 45입니다. 때로는 필드 크기로 스 크롤을 시도하지만 저장 공간을 충분히 준비하는 것이 좋습니다.

64

Linux의 경우 상수 INET6_ADDRSTRLEN (<arpa/inet.h> 포함, man inet_ntop 참조)을 참조하십시오. 내 시스템 (헤더 "in.h")에 : 나는 보라로

#define INET6_ADDRSTRLEN 46 

마지막 문자는 NULL을 종료하기위한, 그래서 최대 길이는 다른 답변으로, 45이다.

0

단일 IP 주소를 포함하는 것으로 보이는 특정 헤더 (예 : HTTP_X_FORWARDED_FOR)를 조심하십시오. 그들은 실제로 여러 개의 주소 (내가 생각하는 프록시 체인)를 포함 할 수 있습니다.

그들은 comma delimited 인 것처럼 보일 수 있으며 총 45 자 이상일 수 있습니다. 따라서 DB에 저장하기 전에 확인하십시오.

+2

약간 충돌하는 -1 (이전에이 함정에 빠졌기 때문에 충돌했습니다.이 답변에는이 페이지에 도착할 일부 사람들과 관련된 정보가 포함되어 있습니다). 그럼에도 불구하고 이것은 분명히 묻는 질문에 대한 답변이 아니기 때문입니다. . 아마도이 질문에 대한 의견으로는 더 좋을 것입니다. –

1

표시된대로 표준 ipv6 주소는 최대 45 자이지만 ipv6 주소에는 고정 된 길이가 없지만 일반적으로 작은 양의 정수인 "범위"또는 "영역"문자열 다음에 끝나는 %를 포함 할 수 있습니다 또는 네트워크 인터페이스 이름이므로 실제로는 45자를 넘을 수 있습니다.네트워크 인터페이스 이름은 일반적으로 "eth0", "eth1", "wlan0"이므로 제한값으로 50을 선택하는 것이 좋습니다.

+0

사실,하지만 이것은 링크 로컬 주소 일 뿐이므로 귀하의 웹 사이트가 인터넷에서 실행되고 있으면 (그리고 희망적으로도 개발 중이 아니더라도) 어떤 것도 보지 않을 것입니다. –