2012-04-25 34 views
5

Tôi có nhiều dự án có chức năng dựa trên địa chỉ IP được cung cấp bởi $_SERVER['REMOTE_ADDR], $_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['CLIENT_IP'].

Địa chỉ IPV4 rất dễ khớp vì chúng tôi luôn nhận được chúng ở cùng định dạng: 4 số nguyên không có số 0 đứng đầu, được phân tách bằng dấu chấm ..

Trong khi địa chỉ IPV6 có thể được nén. Ví dụ: FF01: 0: 0: 0: 0: 0: 0: 101 -> FF01 :: 101

Tôi đã nghiên cứu vấn đề này nhưng chưa tìm thấy bất kỳ điều gì phù hợp, vì vậy tôi yêu cầu bạn trải nghiệm . $_SERVER['REMOTE_ADDR] có sử dụng tiêu chuẩn không? Có an toàn để giả định rằng nó sẽ luôn nhận được dưới dạng nén hoặc không nén?

Hoặc tôi có nên nén tất cả chuỗi IPV6 của mình trước khi thử thử không?

Lưu ý:

Lý tưởng nhất là tôi muốn để xử lý địa chỉ IPv6 như dây đàn chứ không phải là cấu trúc nhị phân, để cải thiện khả năng đọc trong mã/Nguồn Cơ sở dữ liệu và cho phép dễ dàng hơn phạm vi phù hợp với IP.

+0

Tôi chưa làm việc với IPv6 nhưng tôi có ấn tượng rằng bạn nên 'inet_pton()' bất kỳ địa chỉ nào bạn muốn thao tác. –

+0

@ ÁlvaroG.Vicario Cảm ơn bạn đã bình luận, tôi chắc chắn sẽ xem xét chức năng này. Nhưng tôi muốn giữ ký hiệu chuỗi nếu có thể. – Tchoupi

Trả lời

5

Nếu bạn sử dụng inet_pton() trước tiên, sau đó chuyển đổi nó trở lại thành chuỗi có inet_ntop(), bạn nên có một biểu diễn chuỗi nhất quán. Tôi sẽ không dựa vào đầu vào để nhất quán ...

+1

Tôi đã thử nghiệm nó và nó dường như đưa ra một kết quả nhất quán. Đây có thể là chính xác những gì tôi đang tìm kiếm. Tôi sẽ thử nghiệm nó trong một dự án thực tế để xem nó có hoạt động không. – Tchoupi

+0

Tôi đã thử nghiệm, nó hoạt động hoàn hảo. Và nó đủ đơn giản. Cảm ơn! – Tchoupi

+1

@Sander [inet_pton()] (http://php.net/manual/en/function.inet-pton.php) và [inet_ntop()] (http://php.net/manual/en/function. inet-ntop.php) ... bạn có thể đặt các liên kết này trong câu trả lời của bạn không? –

1

Định dạng được đề xuất cho địa chỉ IPv6 ở RFC 5952.

Tuy nhiên, bạn không thể dựa vào tất cả các địa chỉ ở định dạng đó và định dạng chuỗi đặc biệt tệ hại cho các so sánh phạm vi. Đọc RFC sẽ cung cấp cho bạn một số ý tưởng về việc có bao nhiêu cách có thể đại diện hợp pháp cho cùng một địa chỉ IPv6.

Bạn thực sự nên phân tích cú pháp địa chỉ (sử dụng inet_pton như được đề cập ở nơi khác) và thực hiện so sánh phạm vi của bạn trên trường 128 bit kết quả.

Thường xuyên hơn, bạn sẽ không chỉ quan tâm đến 64 bit quan trọng nhất, phù hợp nhất với long trên hầu hết các kiến ​​trúc.

1

Các CGI spec rõ ràng là bất kỳ RFC compliant địa chỉ IPv6 là hợp lệ:

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]. 

Một lập trình viên lành mạnh xác nhận tất cả các đầu vào. Do đó bạn nên xử lý bất kỳ biến môi trường nào như là đầu vào bị nhiễm độc và xác thực/biến đổi. Tiêu đề được cung cấp bởi một khách hàng, chẳng hạn như X-Forward-For et al nên LUÔN LUÔN được đối xử với sự nghi ngờ.

Vậy điều gì về việc mở rộng địa chỉ IPv6?

Câu hỏi này có been asked beforethere are several solutions bao gồm a PEAR one

Hope this helps!

+0

Cảm ơn!Tôi sẽ tất nhiên đầu tiên xác nhận nó là một IP hợp lệ. Thực ra tôi đang sử dụng các hàm được cung cấp trong http://stackoverflow.com/questions/444966/working-with-ipv6-addresses-in-php để lưu trữ IPV4 và IPV6 trong cơ sở dữ liệu. Giải pháp PEAR có vẻ như là một giải pháp tốt, tôi chắc chắn sẽ thử. – Tchoupi

+0

thậm chí cho rằng chức năng Pear, cố gắng để làm phạm vi trận đấu trên một định dạng chuỗi IPv6 (thậm chí mở rộng đầy đủ) sẽ rất khó khăn, đặc biệt là nếu phạm vi không rơi trên một ranh giới nybble (tức là a/62) – Alnitak

+0

@Alnitak tốt điểm. Phạm vi IP của tôi có thể được giảm xuống để nibble ranh giới, do đó, một 'strpos' đơn giản nên làm các trick, giả sử tôi có đầu vào phù hợp. – Tchoupi

Các vấn đề liên quan