2011-11-15 21 views
10

Tôi đang lưu địa chỉ IP của người dùng bằng cách lưu giá trị $_SERVER['REMOTE_ADDR'] trong cơ sở dữ liệu MySQL. Vấn đề là đối với cả Firefox và Chrome $_SERVER['REMOTE_ADDR']::1 (có nghĩa là localhost trong IPv6) và đối với IE và Opera là 127.0.0.1 (IPv4).Các trình duyệt khác nhau, các IP khác nhau?

Vì vậy, câu hỏi của tôi là

  • có các phiên bản trình duyệt IP phụ thuộc? (Tôi từng nghĩ nó phụ thuộc vào máy tính)

  • Tôi có nên tạo hai trường trong cơ sở dữ liệu, một cho địa chỉ IPv4 và một cho IPv6 không?

  • Tôi có nên hợp nhất tất cả IP thành IPv6 không? Và làm thế nào tôi có thể làm điều này trong PHP (nếu nó thậm chí có thể)?

Trả lời

6
  1. Khá rõ ràng - hộp của bạn được hỗ trợ IPv6, Firefox/Chrome sử dụng IPv6 bất cứ khi nào có sẵn, trong khi trình duyệt IE và Opera không (hoặc đó là một khung cảnh off-by-mặc định).

  2. Lưu địa chỉ trong chuỗi đủ dài để giữ địa chỉ IPv6.

  3. Không, vì trong trường hợp chung bạn không thể.

+0

Nhưng ... không phải là IP giống nhau nhưng chỉ trong các biểu diễn khác nhau? Ý tôi là, nếu một trang web cấm tôi bằng IP trong khi điều hướng trong Chrome, điều đó có nghĩa là việc ghi nhật ký với Opera tôi có thể bỏ qua nó? – federicot

+2

Không. Đó là hai mạng vận chuyển khác nhau với hai không gian địa chỉ khác nhau. Trong mạng hai giao thức, bạn có địa chỉ IPv6 và địa chỉ IPv4, địa chỉ này có thể hoặc không khớp, tùy thuộc vào thiết lập mạng. –

+1

@ John Doe: về lý thuyết, vâng. Bạn sẽ có hai IP khác nhau để chặn một người vẫn sẽ cho người khác qua. Trong thực tế, có lẽ không. Không có nhiều trang web được bật IPv6 và ít ISP cung cấp khả năng kết nối IPv6 mà không có đường hầm/đóng gói. –

2

Sử dụng hàm PHP inet_pton để chuyển đổi địa chỉ IP có thể đọc được thành biểu diễn đóng gói của chúng. Sau đó, bạn có thể lưu trữ từng địa chỉ IP trong trường BINARY(16) hoặc VARBINARY(16) trong cơ sở dữ liệu của mình.

2

Trình duyệt sẽ sử dụng mọi thứ khả dụng. Đây có thể là IPv4 hoặc IPv6 và thậm chí có thể thay đổi trong phiên. Trên hết, hãy lưu ý rằng một máy chủ có thể có nhiều địa chỉ IPv6 để nó có thể thay đổi trong phiên làm việc.

Tóm lại: không phụ thuộc vào giá trị của REMOTE_ADDR quá nhiều :-)

+0

Được biết rằng và nhiều người có thể chia sẻ IP, v.v., nhưng độ chính xác trong trường hợp này không phải là cực kỳ quan trọng đối với tôi, vì vậy tôi sẽ để nó trượt – federicot

+0

@JohnDoe: Nó không chỉ là vấn đề chính xác "cực" - * nhiều * văn phòng, điểm phát sóng WiFi, mạng gia đình, v.v. , chỉ sử dụng một địa chỉ IP duy nhất cho toàn bộ mạng. Nếu bạn quan tâm đến việc phân biệt hai người dùng khác nhau trên các máy tính xách tay khác nhau tại cùng một Starbucks, thì bạn không nên xác định chúng bằng địa chỉ IP. –

+1

@JohnDoe Những gì bạn đề cập chính xác ngược lại với những gì tôi nói: bạn nói về nhiều người dùng sử dụng cùng địa chỉ IP, tôi đang nói về một người dùng sử dụng nhiều địa chỉ (IPv4 và/hoặc IPv6). Điều đó có thể được gây ra bởi vì ai đó có nhiều địa chỉ IPv6, bởi vì họ nằm phía sau cổng NAT444 có nhiều địa chỉ IPv4 công cộng và bởi vì người dùng chuyển đổi giữa các địa chỉ IPv4 và IPv6 đó. –