问题描述
- 这段代码怎么解释。。
- public static string GetIP()
{
string result = String.Empty;result = HttpContext.Current.Request.ServerVariables[""HTTP_X_FORWARDED_FOR""]; if (string.IsNullOrEmpty(result)) { result = HttpContext.Current.Request.ServerVariables[""REMOTE_ADDR""]; } if (string.IsNullOrEmpty(result)) { result = HttpContext.Current.Request.UserHostAddress; } if (string.IsNullOrEmpty(result) || !Regex.IsMatch(result @""^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$"")) { return ""127.0.0.1""; } return result; }
解决方案
public static string GetIP()
{
string result = String.Empty;
result = HttpContext.Current.Request.ServerVariables[""HTTP_X_FORWARDED_FOR""]; 如果有代理,返回代理服务器报告的原始ip(而不是代理主机的ip)
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.ServerVariables[""REMOTE_ADDR""]; 返回主机ip
}
if (string.IsNullOrEmpty(result)) { result = HttpContext.Current.Request.UserHostAddress; 这一步实际上多余,UserHostAddress就是remote_addr } if (string.IsNullOrEmpty(result) || !Regex.IsMatch(result @""^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$"")) 如果没有ip,比如说内网回环,那么返回127.0.0.1是对的,但是如果是ipv6 ip,这么返回是不对的。总之,这样写简单粗暴且欠考虑。 { return ""127.0.0.1""; } return result;}
解决方案二:
就是获取IP的方法。判断了3次,如果前面3个方法都没有的话或者结果不符合IP地址规则的话,最终返回127.0.0.1.
解决方案三:
这段代码是错误!
因为正则表达式匹配时,没有考虑IPv6.
时间: 2024-11-08 18:35:26