HTTP中ip地址伪造的问题以及解决办法
在真实环境下,php获取客户端ip地址的方法通常有以下几种:
(1):通过$_SERVER[ "HTTP_CLIENT_IP" ]
(2):通过$_SERVER[ "HTTP_X_FORWARDED_FOR" ]
(3):通过$_SERVER[ "REMOTE_ADDR" ]
这里需要注意的是:在php中的$_SERVER数组中以HTTP开头的值,都是由客户端(client)传递到服务端的,也就是说这一部分是可以进行伪造的。而$_SERVER[ "REMOTE_ADDR" ]是由服务器传递的,是不能进行伪造的(如果这一部分都可以伪造,那就服务器没有办法传递数据到正确的客户端上了)
php通过curl函数进行HTTP_CLIENT_IP以及HTTP_X_FORWARDED_FOR进行伪造:
curl_setopt( $ch , CURLOPT_HTTPHEADER , array('X-FORWARDED-FOR:'.$ip, 'CLIENT-IP:'.$ips ) );
其中的 $_SERVER[ "HTTP_X_FORWARDED_FOR" ] 一开始我压根不知道这是什么,后来查了一下,总结一下:X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。它的基本格式如下:X-Forwarded-For: client, proxy1, proxy2 (存在反向代理以及负载均衡时会用到,这个也是可以伪造的)
在不存在反向代理或负载均衡的情况下,服务端通过$_SERVER[ "REMOTE_ADDR" ]就可以获取真实的客户端ip地址
在存在反向代理或负载均衡的情况下,服务端通过$_SERVER[ "REMOTE_ADDR" ]获取到的并不是客户端的ip地址,而是反向代理服务器或者分发服务器的ip地址(详情看下图)
服务端获取的remote_addr其实是由传递数据到php解析器的服务器传递的,传递时连接服务器的ip地址,上图http文件服务器所获取的remote_addr就是nginx服务器的ip地址
如何在存在反向代理以及负载均衡的情况下获取客户端的真实的ip地址那?解决办法如下:
在上图的nginx服务器(代理服务器中)进行HTTP_X_FORWARD_FOR参数的配置,配置如下:
location ~ "\.+\.php$" {
fastcgi_pass localhost:9000;
fastcgi_param HTTP_X_FORWARD_FOR $remote_addr;
} -----nginx向php-fpm传递的HTTP_X_FORWARD_FOR参数是nginx获取的真实的客户端ip,那么在php脚本中直接获取$_SERVER[ "HTTP_X_FORWARD_FOR" ]就可以获取真实的客户端ip地址了
最新文章
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
- 每天记一些php函数,jQuery函数和linux命令(三)
- 使用.NET FrameWork获取CPU,内存使用率以及磁盘空间
- WPF中的VisualTreeHelper
- Keep two divs sync scroll and example
- 【HDOJ】4775 Infinite Go
- (转载)Flash Builder和flashdevelop 常用快捷键
- [Javascript] Log Levels and Semantic Methods
- PHP 时间和日期 总结
- 姿势体系结构的详细解释 -- C
- CoffeeScript NgComponent
- 驱动7段LED显示器
- 新手站长选择WordPress程序建站需要注意的8个问题
- TypeScript设计模式之门面、适配器
- Appium python自动化测试系列之自动化截图(十一)
- 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例
- 基于Django框架对MongoDB实现增删改查
- [LeetCode&;Python] Problem 504. Base 7
- nginx报502 bad GateWay错误的解决方法
- sencha touch 在线实战培训 第一期 第一节
热门文章
- Java中的集合详解及代码测试
- Sprak2.0 Streaming消费Kafka数据实时计算及运算结果保存数据库代码示例
- VS 2019编辑含有资源文件.resx的项目时提示MSB3086 任务未能使用 SdkToolsPath 或注册表项找到“al.exe”
- Uboot命令U_BOOT_CMD分析
- python数据分析第二版:数据加载,存储和格式
- B2C自营商城的订单设计方案
- wine安装与配置
- 英语单词composing
- OC + RAC (二) Command 命令的用法
- (转)cat >; file <;<; EOF 的用法