All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
查询数据库中重复记录的方法_[SQL Server教程]
基于AJAX技术提高搜索引擎排名_[AJAX教程]
ASP.net下大文件上传的解决方案及WebbUpload组件源码_[Asp.Net教程]
用php读取xml数据_[PHP教程]
PHP实例:学习PHP程序对用户身份认证实现两种方法_[PHP教程]
HTML语言剖析(十一)排版标记_[Html教程]
PHP实例:PHP制作的网站意见在线反馈表_[PHP教程]
非常实用的效果:用JS计算剩余可用字数_JavaScript技术_编程技术
ASP.NET2.0中控件的简单异步回调_.net资料_编程技术
怎样才能成为PHP高手?学会“懒惰”的编程_php资料_编程技术
Reading number is top 10 pictures
再来随便发几张
Soldier saw beauty after the reaction
Li Zongrui hunting video screenshots2
徐若瑄展示美丽胸围3
China's family planning commission forced abortions 270 million newborns for 30 years
Breasts woman big set 1
Chinese paper-cut grilles art appreciation6
More attractive than sora aoi1
Photographed the passion of the clients and prostitutes in the sex trade picture2
Seductive beauty of crime1
Download software ranking
C#与.NET技术平台实战演练
c#程序设计案例教程
matrix1
变速齿轮3.26
Boxer vs Yellow1
linux安装大全
双旗镇刀客A
WebService在.NET中的实战应用教学视频 → 第2集
Tram sex maniac 2 (H) rar bag7
Kung.Fu.Panda.2
delv published in(发表于) 2014/1/6 9:14:50 Edit(编辑)
真正的取真实IP地址及利弊_[Asp.Net教程]

真正的取真实IP地址及利弊_[Asp.Net教程]

真正的取真实IP地址及利弊_[Asp.Net教程]

目前网上流行的所谓“取真实IP地址”的方法,都有bug,没有考虑到多层透明代理的情况。


多数代码类似:


string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null
&& HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] !=String.Empty)
?HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
:HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];


事实上,上面的代码只试用与用户只使用了1层代理,如果用户有2层,3层HTTP_X_FORWARDED_FOR 的值是:“本机真实IP,1层代理IP,2层代理IP,.....” ,如果这个时候你的数据中保存IP字段的长度很小(15个字节),数据库就报错了。


实际应用中,因为使用多层透明代理的情况比较少,所以这种用户并不多。


其他应用情况,现在越来越多的网站使用了代理加速方式,比如 新浪、SOHU的新闻 都使用Squid做代理方式,利用多台服务器分流。Squid本身类似透明代理,会发送“HTTP_X_FORWARDED_FOR” ,HTTP_X_FORWARDED_FOR 中包括客户的IP地址,如果此时客户已经使用了一层透明代理,那么程序取的 “HTTP_X_FORWARDED_FOR” 就包括两个IP地址。(我遇到过3个IP地址的情况,4个的未遇到过)


所以取“真正”IP地址的方式,还应该判断 “HTTP_X_FORWARDED_FOR” 中是否有“,”逗号,或者长度是否超长(超过15字节 xxx.xxx.xxx.xxx)。


所以代码应该如下:


/**////


/// 取得客户端真实IP。如果有代理则取第一个非内网地址
///

public static string IPAddress
{
get
{
string result = String.Empty;

result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if(result!=null&&result!= String.Empty)
{
//可能有代理
if(result.IndexOf(".")==-1) //没有“.”肯定是非IPv4格式
result = null;
else
{
if(result.IndexOf(",")!=-1)
{
//有“,”,估计多个代理。取第一个不是内网的IP。
result = result.Replace(" ","").Replace("'","");
string[] temparyip = result.Split(",;".ToCharArray());
for(int i=0;i {
if( Text.IsIPAddress(temparyip[i])
&& temparyip[i].Substring(0,3)!="10."
&& temparyip[i].Substring(0,7)!="192.168"
&& temparyip[i].Substring(0,7)!="172.16.")
{
return temparyip[i]; //找到不是内网的地址
}
}
}
else if(Text.IsIPAddress(result)) //代理即是IP格式
return result;
else
result = null; //代理中的内容 非IP,取IP
}

}

string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] !=String.Empty)?HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]:HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];



if (null == result || result == String.Empty)
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

if (result == null || result == String.Empty)
result = HttpContext.Current.Request.UserHostAddress;

return result;
}
}


取“HTTP_X_FORWARDED_FOR” 的弊端。


HTTP_X_FORWARDED_FOR 是HTTP协议中头的一部分,不影响TCP的通讯。也就是说实际上客户端可以发送任意内容的 HTTP_X_FORWARDED_FOR,以就是伪造IP。最简单的是WEB程序的IP记录,本来是要记录真实IP的,反而被“黑客”欺骗。当你的应用程序记录客户的访问IP、拒绝或允许部分IP的访问、错误日志 都会出错,甚至误杀。


因此必要的安全日志应该记录 完整的 “HTTP_X_FORWARDED_FOR” (至少给数据库中的字段分配 3*15+2 个字节,以记录至少3个IP) 和 “REMOTE_ADDR”。对 HTTP_X_FORWARDED_FOR 的IP格式检查也是不可少的。

附:(Text是我自定义的一个类,IsIPAddress是其中的一个判断是否是IP地址格式的方法)
#region bool IsIPAddress(str1) 判断是否是IP格式
/**////


/// 判断是否是IP地址格式 0.0.0.0
///

/// 待判断的IP地址
/// true or false
public static bool IsIPAddress(string str1)
{
if(str1==null||str1==string.Empty||str1.Length<7||str1.Length>15) return false;


string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}";


Regex regex = new Regex(regformat,RegexOptions.IgnoreCase );
return regex.IsMatch(str1);
}
#endregion








添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.