当前位置: 首页 > news >正文

使用HTTP_X_FORWARDED_FOR获取客户端IP的严重后果

在WEB开发中.我们可能都习惯使用下面的代码来获取客户端的IP地址:

C#代码

//优先取得代理IP 
string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
if (string.IsNullOrEmpty(IP)) {
     //没有代理IP则直接取连接客户端IP 
     IP = Request.ServerVariables["REMOTE_ADDR"]; 
} 

 

上面代码看来起是正常的.可惜这里却隐藏了一个隐患!!因为"HTTP_X_FORWARDED_FOR"这个值是通过获取HTTP头的"X_FORWARDED_FOR"属性取得.所以这里就提供给恶意破坏者一个办法:可以伪造IP地址!! 

下面是测试代码: 
C#代码

复制代码
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/ip.aspx"); 
request.Headers.Add("X_FORWARDED_FOR", "0.0.0.0"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
StreamReader stream = new StreamReader(response.GetResponseStream()); 
string IP = stream.ReadToEnd(); 
stream.Close(); 
response.Close(); 
request = null; 
复制代码

 

"ip.aspx"文件代码: 
C#代码

复制代码
Response.Clear(); 
//优先取得代理IP 
string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
if (string.IsNullOrEmpty(IP))
{ 
  //没有代理IP则直接取客户端IP 
  IP = Request.ServerVariables["REMOTE_ADDR"]; 
} 
Response.Write(IP); 
Response.End(); 
复制代码

 

这样.当测试代码中去访问ip.aspx文件时."string IP = stream.ReadToEnd();"这段代码取到的IP数据就是"0.0.0.0"!!!!(呵.在真实情况下.这样的IP地址肯定不是我们想要的结果.而在有些投票系统中限制一个IP只能投1次票时,如果也是用类似的代码取得对方IP然后再判断的话.呵呵.限制就失效咯)... 

或者如果你用上面代码获取IP地址后后面又不再进行数据判断的话也许还能更进一步进行数据破坏!!
比如你用类似上面的代码中获取IP地址就直接有这样的SQL语句:

 string sql = "INSERT INTO (IP) VALUE ('" + IP + "')"; 

 


那么也许破坏者还可以进行SQL注入进行数据破坏!! 

相关文章:

  • ownCloud 开源云数据存储平台
  • PHPCMS v9 Getshell(Apache)
  • 从MSSQL里执行命令导出为MDF
  • load_file()常用路径
  • 计算机网络的分层体系结构
  • windows 环境变量被改变了,不能使用cmd ?怎么办?
  • Ubuntu命令大合集
  • JDK1.6在LINUX下的安装配置
  • 配置squid 反向代理提高网站性能
  • PHP中常用的正则表达式收藏
  • cisco三层交换配置命令
  • Linux服务器安全防护
  • oracle常用的几个数据库信息查询
  • 中间件概念和简介
  • 思科CISCO ACL配置详解
  • [PHP内核探索]PHP中的哈希表
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Android优雅地处理按钮重复点击
  • CSS魔法堂:Absolute Positioning就这个样
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript对象详解
  • js对象的深浅拷贝
  • Redash本地开发环境搭建
  • swift基础之_对象 实例方法 对象方法。
  • WePY 在小程序性能调优上做出的探究
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于webpack 的 vue 多页架构
  • 深入 Nginx 之配置篇
  • 实现简单的正则表达式引擎
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 学习使用ExpressJS 4.0中的新Router
  • 一道闭包题引发的思考
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 主流的CSS水平和垂直居中技术大全
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 阿里云重庆大学大数据训练营落地分享
  • ​linux启动进程的方式
  • (C++20) consteval立即函数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (多级缓存)缓存同步
  • ****Linux下Mysql的安装和配置
  • .dwp和.webpart的区别
  • .NET 5种线程安全集合
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net操作Excel出错解决
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .py文件应该怎样打开?
  • .考试倒计时43天!来提分啦!
  • @Autowired标签与 @Resource标签 的区别
  • [C#][DevPress]事件委托的使用