2012-06-11 37 views
11

Tôi đang tạo biểu mẫu bằng PHP và tôi muốn lưu bản ghi địa chỉ IP của người dùng. Đây là snip-nó mã tôi đã sử dụng:

<input type="hidden" name="ip" value="<?php echo $_SERVER['REMOTE_ADDR']; ?>" /> 

Khi tôi mở mã lên trong XAMPP và đọc nguồn, giá trị đã có một địa chỉ IP khác so với những gì là của tôi:

<input type="hidden" name="ip" value="::1" /> 

Địa chỉ IP này có thường xảy ra khi tôi sử dụng nó trong một localhost (XAMPP) không?
Nếu không, có bất kỳ lựa chọn thay thế nào để lấy địa chỉ IP của người dùng không?

Trả lời

18

<input type="hidden" name="ip" value="<?php echo $_SERVER['REMOTE_ADDR']; ?>" />

Đừng làm điều đó. Nhận yêu cầu từ $_SERVER khi biểu mẫu được gửi. Bắt nó khi biểu mẫu được tạo ra và lưu trữ nó trong biểu mẫu chỉ cho mọi người cơ hội thay đổi nó.

Does this IP address normally happen when I use it in a localhost (XAMPP)?

Yes. Nhận địa chỉ IP cục bộ (IPv6) là bình thường khi bạn yêu cầu một trang từ localhost.

+0

Thx để biết cách thay đổi khi được gửi;) – zeldarulez

+0

Điều gì sẽ xảy ra nếu ai đó thay đổi địa chỉ IP của mình bằng cách nào đó (như sử dụng VPN hoặc bất kỳ thứ gì)? Sau đó, tôi sẽ không nhận được ip chính xác của máy tính đó. Là nó? – partho

4

':: 1' là phiên bản IPV6 của máy chủ cục bộ (hoặc 127.0.0.1).

Mở cổng 80 và truy cập trang từ Địa chỉ IP của bạn. Nên làm việc tốt sau đó :).

1

Đây thực sự là IP của bạn. Mặc dù IP IPv6 của bạn chứ không phải IPv4.

Trong IPv6, :: 1 là viết tắt của localhost/127.0.0.1.

25

IP ::1 là "localhost" trong phiên bản IPv6. Máy của bạn được cấu hình với IPv6 - và do đó bạn sẽ nhận được địa chỉ IP này. Có thể, khi bạn triển khai ứng dụng của mình trên máy chủ trực tiếp, IPv6 sẽ không được định cấu hình trên máy chủ và ứng dụng của bạn sẽ nhận được địa chỉ IPv4 quen thuộc hơn (ví dụ: aaa.bbb.ccc.ddd).

Lưu ý khác, $_SERVER['REMOTE_ADDR'] không phải lúc nào cũng chứa đúng địa chỉ. Sử dụng tốt hơn:

if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR']; 
} else { 
    $ip_address = $_SERVER['REMOTE_ADDR']; 
} 
+0

Thx cho đầu! Tôi sẽ ghi nhớ điều đó. ;) – zeldarulez

+3

Có liên quan, nhưng cũng lưu ý nếu bạn sử dụng HTTP_X_FORWARDED_FOR, bạn không thể tin tưởng điều này để chỉ cho phép truy cập vào các IP cục bộ cho các trang quản trị an toàn, bởi vì đầu đó có thể được giả mạo rất dễ dàng. Trong thực tế, StackOverflow đã từng là nạn nhân của điều này và may mắn là một người dùng thân thiện đã báo cáo cho họ. – smdrager

+0

@smdrager: vậy cách an toàn để nhận địa chỉ IP của người dùng là gì? Tôi cần cho phép trang của mình mở chỉ cho một IP duy nhất. – sqlchild

4

1). Bạn không cần phải thêm <?php echo $_SERVER['REMOTE_ADDR']; ?> để tạo thành. Trong trường hợp này rất dễ dàng để giả mạo nó (thực sự nó dễ dàng bất kỳ trường hợp). Tốt hơn hãy thêm IP vào dữ liệu ở phía máy chủ.

2) Bạn cũng có thể xem $_SERVER['HTTP_X_FORWARDED_FOR']. Nếu người dùng có proxy, một số proxy (proxy trong suốt) đặt IP của người dùng thực ở đó.

3) Chỉ cần lưu ý: Dữ liệu về IP không đáng tin cậy chút nào.

0
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARTDED_FOR'] != '') { 
       $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR']; 
      } else { 
       $ip_address = $_SERVER['REMOTE_ADDR']; 
      } 

Mã này trả về ip của ứng dụng khách. Nếu bạn nghĩ rằng đây là IP máy chủ, có thể bạn đã đúng vì máy chủ của bạn (có lẽ) được lưu trữ trên máy của bạn. Vì máy khách của bạn (máy tính) và máy chủ chạy trên cùng một máy tính, cả hai đều có cùng một ip. Nếu bạn không hiểu điều này, bạn nên thực sự làm một số nghiên cứu thành ips, ips địa phương và tất cả những thứ đó.

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