ASP.NET网页设计真实的取实在IP地点及利害
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.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)
&&temparyip.Substring(0,3)!="10."
&&temparyip.Substring(0,7)!="192.168"
&&temparyip.Substring(0,7)!="172.16.")
{
returntemparyip;//找到不是内网的地点
}
}
}
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语言的程序,比其他任何语言更加容易跨平台。 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。 微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。 由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。 ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。 目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
页:
[1]