C\#실제 IP 주 소 를 가 져 옵 니 다(IP 를 긴 성형 으로 전환 하고 내부 네트워크 IP 여 부 를 판단 하 는 방법)

3729 단어 C#IP 주소
오늘 로그 인 로 그 를 보 니 httpx_forwarded_for 가 져 온 ip 주 소 는 내부 네트워크 ip 주소 이 고,어떤 것 은 공공 네트워크 와 내부 네트워크 ip 주소 와 함께 얻 을 수 있 으 며,쉼표 로 구분 되 어 있 으 며,로 그 는 다음 과 같이 캡 처 되 어 있 습 니 다.

이전에 IP 주 소 를 가 져 온 C\#코드 는 다음 과 같 습 니 다.

    /// <summary>
    /// C# IP
    /// </summary>
    /// <returns></returns>
    public static string GetIP()
    {
        string ip = HttpContext.Current.Request.ServerVariables["http_x_forwarded_for"];
        if (UserCheck.IsNull(ip)) ip = HttpContext.Current.Request.ServerVariables["remote_addr"];
        return ip;
    }
보아하니 httpx_forwarded_for 는 다른 소프트웨어 나 ISP 에 의 해 수정 되 어 httpx_forwarded_for 에서 실제 프 록 시 ip 주 소 를 얻 을 수 없습니다.이전 로그 인 로 그 는 ip 주소 가 허용 되 는 ip 세그먼트 에 있 는 지 판단 하여 시스템 에 로그 인 할 수 없습니다.마지막 으로 코드 를 수정 하면 다음 과 같 습 니 다.내부 네트워크 나 개인 주소 인지,ipv 4 의 주소 규격 에 부합 되 는 지,부합 되 지 않 는 지,remote 를 사용 하 는 지 판단 합 니 다.addr 클 라 이언 트 의 ip 주 소 를 가 져 옵 니 다.
실제 주 소 를 안전하게 가 져 오 는 실현 코드:

 /// <summary>
    /// C# IP
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    public static long IpToNumber(string ip)
    {
        string[] arr = ip.Split('.');
        return 256 * 256 * 256 * long.Parse(arr[0]) + 256 * 256 * long.Parse(arr[1]) + 256 * long.Parse(arr[2]) + long.Parse(arr[3]);
    }
    /// <summary>
    /// C# IP / ip
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    public static bool IsPrivateIp(string ip)
    {
        long ABegin = IpToNumber("10.0.0.0"), AEnd = IpToNumber("10.255.255.255"),//A IP
         BBegin = IpToNumber("172.16.0.0"), BEnd = IpToNumber("172.31.255.255"),//'B IP
         CBegin = IpToNumber("192.168.0.0"), CEnd = IpToNumber("192.168.255.255"),//'C IP
         IpNum = IpToNumber(ip);
        return (ABegin <= IpNum && IpNum <= AEnd) || (BBegin <= IpNum && IpNum <= BEnd) || (CBegin <= IpNum && IpNum <= CEnd);
    }
    /// <summary>
    /// C# IP
    /// </summary>
    /// <returns></returns>
    public static string GetIP()
    {
        string ip = HttpContext.Current.Request.ServerVariables["http_x_forwarded_for"];
        if (UserCheck.IsNull(ip)) ip = HttpContext.Current.Request.ServerVariables["remote_addr"];
        else// ip , ipv4
        {
            ip = ip.Trim().Replace(" ", "");
            if (!Regex.IsMatch(ip, @"^\d+(\.\d+){3}$") || IsPrivateIp(ip))
                ip = HttpContext.Current.Request.ServerVariables["remote_addr"];// / remote_addr
        }
        return ip;
    }
2014-07-02 업데이트:cdn 가속 문제,cdn 가속 후 http 판단x_forwarded_for,http_x_forwarded_for 는 마음대로 위조 할 수 있 고 모든 내용 을 배치 할 수 있 기 때문에 다음 그림 에 나타 난 ip 주소 에는 내부 망 주소 나 2 개의 ip 주소 에 문제 가 발생 할 수 있 습 니 다.그래서 http 획득x_forwarded_for 내용 을 얻 으 려 면 split 에서 첫 번 째 항목 을 가 져 와 야 합 니 다.

좋은 웹페이지 즐겨찾기