[C#] ASP.NET에서 사용자의 클라이언트 IP 주소를 얻는 방법은 무엇입니까?

우리는이 Request.UserHostAddressASP.NET에서 IP 주소를 얻을 수 있지만, 일반적으로 사용자의 ISP의 IP 주소, 예를 들어, 링크를 클릭하지 정확하게 사용자의 컴퓨터의 IP 주소입니다. 실제 IP 주소는 어떻게 얻을 수 있습니까?

예를 들어, Stack Overflow 사용자 프로필에서 “마지막 계정 활동 : 4 시간 전부터 86.123.127.8” 이지만 내 컴퓨터 IP 주소는 약간 다릅니다. 스택 오버플로는이 주소를 어떻게 얻습니까?

일부 웹 시스템에는 몇 가지 목적으로 IP 주소 확인이 있습니다. 예를 들어 특정 IP 주소를 사용하면 24 시간마다 다운로드 링크를 5 번만 클릭 할 수 있습니까? 이 IP 주소는 광범위한 클라이언트 또는 인터넷 사용자가있는 ISP가 아닌 고유해야합니다.

잘 이해 했습니까?



답변

다른 사람들이 말했듯이 당신은 당신이 요구하는 것을 할 수 없습니다. 당신이 해결하려고하는 문제를 설명한다면 누군가 도울 수 있습니까?

예 :

  • 사용자를 고유하게 식별하려고합니까?
  • IP 주소 대신 쿠키 또는 세션 ID를 사용할 수 있습니까?

편집하다서버에서 볼 수있는 주소는 ISP의 주소가 아니어야합니다. 광대역의 가정 사용자 주소는 라우터의 주소가되므로 집 안의 모든 장치는 외부에 동일하게 표시되지만 라우터는 NAT를 사용하여 트래픽이 각 장치로 올바르게 라우팅되도록합니다. 사무실 환경에서 액세스하는 사용자의 경우 주소가 모든 사용자에게 동일 할 수 있습니다. ID에 IP 주소를 사용하는 사이트는 매우 잘못 될 위험이 있습니다. 제공 한 예제는 좋은 것이며 종종 실패합니다. 예를 들어, 제 사무실은 영국에 있고, 인터넷에 “나타나는”것으로 보이는 브레이크 아웃 지점은 주요 IT 시설이있는 다른 국가에 있기 때문에 제 사무실에서 내 IP 주소는 영국에없는 것으로 보입니다. 이런 이유로 영국의 웹 콘텐츠에만 액세스 할 수 없습니다. BBC iPlayer와 같은). 주어진 시간에 우리 회사에는 같은 IP 주소로 웹에 액세스하는 것으로 보이는 수백 또는 수천 명의 사람들이있을 것입니다.

서버 코드를 작성할 때 IP 주소가 무엇을 참조하는지 확신 할 수 없습니다. 일부 사용자는이 방법을 좋아합니다. 일부 사람들은 의도적으로 프록시 나 VPN을 사용하여 더 혼란스러워합니다.

컴퓨터 주소가 StackOverflow에 표시된 IP 주소와 다르다고 말할 때 컴퓨터 주소를 어떻게 알 수 있습니까? 로컬로 사용 ipconfig하거나 그와 비슷한 것을 보고 있다면 위에서 설명한 이유로 다를 수 있습니다. 외부 세계가 생각하는 것을 다시 확인하려면 whatismyipaddress.com/을 살펴 보십시오 .

NAT 의이 Wikipedia 링크 는 이에 대한 배경 지식을 제공합니다.


답변

웹 사이트를 방문하는 사람의 IP 주소를 알고 싶을 때가 있습니다. ASP.NET에는이 방법을 수행하는 여러 가지 방법이 있지만 ServerVariables 컬렉션의 “HTTP_X_FORWARDED_FOR”을 사용하는 것이 가장 좋습니다.

이유는 …

때때로 방문자가 프록시 서버 나 라우터 뒤에 있고 표준 Request.UserHostAddress은 프록시 서버 나 라우터의 IP 주소 만 캡처합니다. 이 경우 사용자의 IP 주소는 서버 변수 ( “HTTP_X_FORWARDED_FOR”)에 저장됩니다.

그래서 우리가하고 싶은 것은 먼저 “HTTP_X_FORWARDED_FOR”를 확인하는 것입니다. 만약 이것이 비어 있다면 간단히 반환 ServerVariables("REMOTE_ADDR")합니다.

이 방법은 완벽하지는 않지만 더 나은 결과를 얻을 수 있습니다. 다음은 James Crowley의 블로그 게시물 “Gotcha : HTTP_X_FORWARDED_FOR에서 여러 IP 주소를 반환 함” 에서 가져온 VB.NET의 ASP.NET 코드입니다 .

씨#

protected string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current;
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }

    return context.Request.ServerVariables["REMOTE_ADDR"];
}

VB.NET

Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
    Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
        Return ipArray(0)
    End If
End Function


답변

업데이트 :
Bruno Lopes에게 감사드립니다. 여러 IP 주소가 올 수 있으면이 방법을 사용해야합니다.

    private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }


답변

C #이 이런 식으로 보이면 매우 간단합니다.

string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ??
                   Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();


답변

다른 사용자 IP 주소는 무엇입니까? 네트워크 어댑터의 IP 주소를 원한다면 웹 응용 프로그램에서 IP 주소를 사용할 수있는 방법이 없습니다. 사용자가 NAT 나 다른 것들 뒤에 있다면 IP를 얻을 수 없습니다.

업데이트 : IP를 사용하여 사용자를 제한하는 웹 사이트 (예 : rapidshare)가 있지만 NAT 환경에서는 제대로 작동하지 않습니다.


답변

내 경험을 모두와 공유해야한다고 생각합니다. 어떤 상황에서는 REMOTE_ADDR이 보입니다. 이 원하는 것을 얻지 못할 것입니다. 예를 들어, 씬 뒤에로드 밸런서가 있고 클라이언트의 IP를 얻으려고하면 문제가 발생합니다. IP 마스킹 소프트웨어로 확인했으며 다른 대륙에있는 동료들도 확인했습니다. 그래서 여기 내 해결책이 있습니다.

고객의 IP를 알고 자 할 때 가능한 모든 증거를 선택하여 고유한지 판단 할 수 있도록합니다.

여기서 클라이언트 측의 정확한 IP를 얻으려면 모든 도움이 될 수있는 다른 서버를 찾았습니다. 그래서 사용하고 있습니다 : HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP는 항상 클라이언트의 정확한 IP를 얻습니다. 그 당신에게 가치를 포기하지 않을 경우 어떤 경우에, 당신은 다음을 찾아야한다 HTTP_X_FORWARDED_FOR 그것은 당신에게 클라이언트 IP를 얻을 수있는 최고의 두 번째 후보하고 같이 REMOTE_ADDR가 반환하거나 반환하지 않을 수 var를 찾으십시오. 세 가지는 내가 그들을 모니터링하는 가장 좋은 것입니다.

이것이 일부 사람들에게 도움이되기를 바랍니다.


답변

당신이 사용할 수있는:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();