C#(CSharp) | VC/C++ | C++Builder | ASP(ASP.NET) | SQL Server | OpenGL | CMM | 网站开发SEO | 数控技术 | 地理信息系统 | WINDOWS操作系统 |
联高软件 > 技术文档 > C# > C#取真实IP地址及分析 C#软件开发参考文档

C#取真实IP地址及分析

发表:联高软件www.legalsoft.com.cn,本文被阅读:9949

摘要:文章:C#取真实IP地址及分析 摘要:说一哈,我也是转来的,不是想骗PV,方便自己查而已!目前网上流行的所谓“取真实IP地址”的方法,都有bug,没有考虑到多,发表于北京联高软件有限公司技术文章栏目,代码以高亮显示。
关键字:分析, ip, 地址, result, for, forwarded, string, 代理, current, httpcontext, request, servervariables, gt, null, empty


说一哈,我也是转来的,不是想骗PV,方便自己查而已!

目前网上流行的所谓"取真实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)。

所以代码应该如下:

取"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地址格式的方法)



[C#] 利用GDI+ for.NET 给图片加水印标记 (3033)
[C#] 配置Config.web (2888)
[C#] 用Visual C#做DLL文件 (2804)
[C#] C#中的析构函数 (2343)
[C#] 一个克隆对象的C#基类 (7107)
[C#] C#实现的18位身份证格式验证算法 (2887)
[C#] C#3.0中对象初始化器和集合初始化器 (3639)
[C#] 生成静态文件的新闻系统核心代码(.net C#) (2655)
[C#] c#.net常用函数列表 (2958)
[C#] 把.NET程序部署到没有安装.NET Framwork的机器上 (2557)
[C#] C#实现托盘图标动画显示 (947)
[C#] 在Visual C#中使用XML指南之读取XML (2020)
[C#] 验证控件介绍--RequiredFieldValidator (4009)
[C#] C#实现SMTP服务器 (3607)
[C#] 用C#编程实现读写BINARY (3037)
[C#] 在C#中使用代理的方式触发事件 (4188)
[C#] 超强C#图片上传,加水印,自动生成缩略图源代码(联高原创) (5159)
[C#] C#提取EXCEL文件表格并自动生成HTML页面表格[原创] (1710)
[C#] 像Asp一样轻松分页显示数据(C#) (2444)
[C#] 在C#中应用哈希表(HASHTABLE) (7311)

www.315soft.com