|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.net老师不吝赐教,为小弟这一批迷途的羊羔指一条阳光之道!您也知道:学习技术如果只有一个人摸索,那是一件多么痛苦的事情!还有,如果万辛能得名师或长者指点,那又是多么一件幸福和快乐的事情!ip地点今朝网下流行的所谓“取实在IP地点”的办法,都有bug,没有思索到多层通明代办署理的情形。
多半代码相似:
stringIpAddress=(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)。
以是代码应当以下:
/**////<summary>
///获得客户端实在IP。假如有代办署理则取第一个非内网地点
///</summary>
publicstaticstringIPAddress
{
get
{
stringresult=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(inti=0;i<temparyip.Length;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.")
{
returntemparyip[i];//找到不是内网的地点
}
}
}
elseif(Text.IsIPAddress(result))//代办署理便是IP格局
returnresult;
else
result=null;//代办署理中的内容非IP,取IP
}
}
stringIpAddress=(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;
returnresult;
}
}
取“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地点格局的办法)
#regionboolIsIPAddress(str1)判别是不是是IP格局
/**////<summary>
///判别是不是是IP地点格局0.0.0.0
///</summary>
///<paramname="str1">待判别的IP地点</param>
///<returns>trueorfalse</returns>
publicstaticboolIsIPAddress(stringstr1)
{
if(str1==null||str1==string.Empty||str1.Length<7||str1.Length>15)returnfalse;
stringregformat=@"^d{1,3}[.]d{1,3}[.]d{1,3}[.]d{1,3}$";
Regexregex=newRegex(regformat,RegexOptions.IgnoreCase);
returnregex.IsMatch(str1);
}
#endregion
c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。 |
|