2009-12-15 57 views
45

Tôi muốn nhận địa chỉ IP bất kỳ ai đăng ký trong trang web của tôi. Làm thế nào để làm điều này trong ASPNET. Tôi đã sử dụng mã sau, nhưng, nó không nhận được Địa chỉ IP thích hợpLàm cách nào để nhận địa chỉ IP?

string ipaddress = Request.UserHostAddress; 
+0

1. [http://www.w3schools.com/asp/coll_servervariables.asp](http://www .w3schools.com/asp/coll_servervariables.asp) 2. [http://balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/](http:// balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/) – solairaja

+1

có thể trùng lặp của [Làm thế nào để có được một địa chỉ IP của khách hàng của người dùng trong ASP.NET?](http:/ /stackoverflow.com/questions/735350/how-to-get-a-users-client-ip-address-in-asp-net) –

Trả lời

54

Bạn có thể sử dụng phương pháp này để lấy địa chỉ IP của máy khách.

public static String GetIP() 
{ 
    String ip = 
     HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrEmpty(ip)) 
    { 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } 

    return ip; 
} 
+1

Chia HTTP_X_FORWARDED_FOR và lựa chọn cuối cùng là tốt hơn- xem câu trả lời http://stackoverflow.com/a/13249280/52277 –

+2

'X-Forwarded-For' có thể chứa nhiều địa chỉ IP. – Gabriel

3

Nếu một khách hàng được kết nối thông qua proxy nặc danh không trong suốt, bạn có thể nhận được địa chỉ của họ từ:

Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 

mà có thể trở lại null hoặc "không rõ" nếu IP không thể có được theo cách đó.

Request.ServerVariables["REMOTE_ADDR"] phải giống như Request.UserHostAddress, một trong hai tùy chọn này có thể được sử dụng nếu yêu cầu không phải từ proxy không ẩn danh.

Tuy nhiên, nếu yêu cầu đến từ một proxy ẩn danh, thì không thể trực tiếp nhận IP của ứng dụng khách. Đó là lý do tại sao họ gọi những proxy đó là ẩn danh.

34

HTTP_X_FORWARDED_FOR nên được sử dụng NHƯNG nó có thể trả về nhiều địa chỉ IP được phân tách bằng dấu phẩy. Xem this page.

Vì vậy, bạn nên luôn kiểm tra. Cá nhân tôi sử dụng chức năng Split.

public static String GetIPAddress() 
{ 
    String ip = 
     HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrEmpty(ip)) 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    else 
     ip = ip.Split(',')[0]; 

    return ip; 
} 
+17

Tôi sẽ cẩn thận với điều đó, bạn đang chọn mục đầu tiên có thể là 192.168.x.x.Bạn thường muốn có được cái cuối cùng bởi vì đó là proxy hoặc máy khách cuối cùng kết nối với hệ thống của bạn (và có lẽ là nguồn đáng tin cậy nhất). Xem [wikipedia article] (http://en.wikipedia.org/wiki/X-Forwarded-For) Mã tôi sử dụng nó như thế này: 'ip = (HttpContext.Request.ServerVariables [" HTTP_X_FORWARDED_FOR "] ??" ") .Split (','). Last(). Trim(); ' –

+4

@WouterSimons, Theo cùng [bài viết trên Wikipedia] (https://en.wikipedia.org/wiki/X-Forwarded-For)" bên trái nhất là khách hàng ban đầu ", vì vậy First() nên được sử dụng thay vì Last() –

33

Trong trường hợp bạn sử dụng địa chỉ IP để bảo mật, bạn nên biết cơ sở hạ tầng của mình.

Nếu bạn đang sử dụng proxy giữa máy chủ web và khách hàng đặt tiêu đề, bạn sẽ có thể tin tưởng địa chỉ cuối cùng. Sau đó, bạn sử dụng mã như Muhammed đề xuất với bản cập nhật để luôn nhận địa chỉ IP cuối cùng từ tiêu đề chuyển tiếp (xem mã bên dưới)

Nếu bạn không sử dụng proxy, hãy cẩn thận rằng tiêu đề X-Forwarded-For là rất dễ giả mạo. Tôi đề nghị bạn bỏ qua nó sau đó trừ khi bạn có một lý do rõ ràng tại sao không.

tôi cập nhật mã Muhammed Akhtar như sau để cho phép bạn lựa chọn:

public string GetIP(bool CheckForward = false) 
{ 
    string ip = null; 
    if (CheckForward) { 
     ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    } 

    if (string.IsNullOrEmpty(ip)) { 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } else { // Using X-Forwarded-For last address 
     ip = ip.Split(',') 
       .Last() 
       .Trim(); 
    } 

    return ip; 
} 

này Wikipedia article giải thích những rủi ro triệt để hơn.

0
string result = string.Empty; 
    string ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    if (!string.IsNullOrEmpty(ip)) 
    { 
     string[] ipRange = ip.Split(','); 
     int le = ipRange.Length - 1; 
     result = ipRange[0]; 
    } 
    else 
    { 
     result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } 
+0

Vui lòng thêm giải thích cho mã của bạn (và cải thiện thụt đầu dòng). Điều này sẽ cải thiện chất lượng câu trả lời của bạn! –

+0

Bạn không bao giờ sử dụng biến 'le' đó - tôi đoán bạn muốn sử dụng biến đó thay vì' 0' trong dòng tiếp theo –

4

Trong MVC 6, bạn lấy địa chỉ IP theo cách này:

HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString() 
Các vấn đề liên quan