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

C#取真实IP地址及分析

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

说一哈,我也是转来的,不是想骗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#(CSharp)
·ASP程序员学习C#之超级攻略 (2666)
·通过C#实现集合类纵览.NETCOLLECTIONS及相关技术 (2312)
·C#3.0中对象初始化器和集合初始化器 (1799)
·C#3.0新特性速览 (1699)
·简单实用的C#分词源代码(含词库素材下载) (5424)
·一个代码搞定页面压缩HTTPCOMPRESS源代码 (861)
·C#开发WAP之GOOGLEADSENSE移动广告代码获取源代码[原创] (1389)
·C#代码注释文字自动提取,与他人共享DLL (1964)
·用C#写ASP.NET搜索蜘蛛代码程序 (2382)
·C#编写GOOGLESITEMAP.XML源代码 (1667)
·C#开发WAP之GOOGLEADSENSE移动广告代码获取源代码[原创] (1389)
·C#代码注释文字自动提取,与他人共享DLL (1964)
·用C#写ASP.NET搜索蜘蛛代码程序 (2382)
·C#编写GOOGLESITEMAP.XML源代码 (1667)
·超强C#图片上传,加水印,自动生成缩略图源代码(联高原创) (3124)
·C#中用SYSTEM.XML读写XML说明与代码 (10190)
·C#+DIRECT3D9.0开发实例之月亮绕着地球转 (1987)
·ASP程序员学习C#之超级攻略 (2666)
·通过C#实现集合类纵览.NETCOLLECTIONS及相关技术 (2312)
 最新文章
·一个代码搞定页面压缩HTTPC
·C#开发WAP之GOOGLEADSENSE移
·EXCEL合并文件及合并工作表
·C#代码注释文字自动提取,与
·两种通用分页存储过程的对比
·用C#写ASP.NET搜索蜘蛛代码
·C#编写GOOGLESITEMAP.XML源
·静态HTML代码优化的基本SEO
·几项SEO原则打造良好的网页
·如何使用SQLSERVER2000中的
·超强C#图片上传,加水印,自
·C#中用SYSTEM.XML读写XML说
·C#取真实IP地址及分析
·C#+DIRECT3D9.0开发实例之月
·ASP程序员学习C#之超级攻略
·通过C#实现集合类纵览.NETC
·C#开发WAP程序实例
·C#3.0中对象初始化器和集合
·C#3.0新特性速览
·ASP和ASP.NET的MD5加密中文
·CSS截取固定长度字符串
·简单实用的C#分词源代码(含
·C#高效分页代码(不用存储过
·SERVER.TRANSFER是在两个页
·一个克隆对象的C#基类
·C#语言FTP客户端代码
·递归枚举排列、组合的C#源码
·在C#.NET中跟踪代码的运行过
·ASP.NET2.0中实现跨页面提交
·C#通用的数据操作类
·常用的C#数据检查类
·C#中的域(FIELD)和属性(
·C#编码规范和编程好习惯
·C#编码好习惯
·用C#实现C/S模式下软件自动
·C#参考之访问关键字:BASE、
·C#实现遗传算法模拟花朵的进
·用C#的类实现数据结构的堆栈
·在C#中应用哈希表(HASHTABL
·用C#生成中文汉字验证码的基
·C#.NET支付宝接口
·在C#中利用SHARPZIPLIB进行
·程序员必须知道的SQLSERVER
·360度全方位比较C#和VB
·C#设计模式之建造者(BUILDE
·C#抽象工厂模式的几种实现方
·用设计模式固化C#程序
·数据结构与算法(C#实现)系列
·在C#中建立复杂的、灵活的S
·解读C#中的正则表达式
 热门文章
·程序员必须知道的SQLSERVER
·OpenGL 入门教程(一)
·C#中用SYSTEM.XML读写XML说
·OpenGL基础篇
·使用回调函数(VC & Delphi)
·OpenGL 入门教程(二)
·C++Builder的一些技巧
·数控加工技术试题库
·矩阵相乘的快速算法
·矩阵求逆的快速算法
·C#中SOCKET多线程编程实例
·数控车床加工编程典型实例分
·如何实现进程间数据通讯技术
·数控试题(一)
·第一个三角形:NeHe的OpenG
·数控考题(二)
·选择与反馈 (OpenGL)
·函数调用的几个概念:_stdc
·用C#实现C/S模式下软件自动
·C#高效分页代码(不用存储过
·SERVER.TRANSFER是在两个页
·TServerSocket和TClientSoc
·OpenGL 入门教程(三)
·OpenGL 入门教程(四)
·Dijkstra 最短路径算法的一
·地理信息系统中的常规网络分
·数控机床标准M代码
·数控车床基本坐标关系及几种
·纹理映射:OPENGL 教程-第六
·OpenGL 入门教程(六)