C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法)。本站提示廣大學習愛好者:(C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法))文章只能為提供參考,不一定能成為您想要的結果。以下是C#獲得真實IP地址(IP轉為長整形、斷定能否內網IP的辦法)正文
明天檢查登錄日記,發明http_x_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;
}
看來http_x_forwarded_for應當是被其他軟件或許ISP修正過了,招致http_x_forwarded_for得不到真實的署理ip地址。之前上岸日記是要斷定ip地址能否在許可的ip段內的,如許招致沒法上岸體系。最初修正代碼以下,增長斷定能否為內網或許公有地址,能否相符ipv4的地址規格,不相符照樣應用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().WordStr(" ", "");
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下獲得第一個項。