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地址了
HTTP中ip地址伪造的问题以及解决办法的更多相关文章
- PHP中IP地址与整型数字互相转换详解
这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...
- 关于pycharm中pip版本10.0无法使用的解决办法
背景: 近期在利用 pycharm 安装第三方库时会提示 pip 不是最新版本, 因此对 pip 进行更新,但是生成最新版本之后, pip 中由于缺少 main 函数,导致在 pycharm 中无法自 ...
- [转]iOS Safari 中click点击事件失效的解决办法
iOS Safari 中click点击事件失效的解决办法 问题起因: 在微信公众号开发(微站)过程中用jquery的live方法绑定的click事件点击无效(不能执行) 问题描述 当使用委托给一个元素 ...
- python matplotlib plot 数据中的中文无法正常显示的解决办法
转发自:http://blog.csdn.net/laoyaotask/article/details/22117745?utm_source=tuicool python matplotlib pl ...
- eclipse中的js文件报错的解决办法
在使用别人的项目的时候,导入到eclipse中发现js文件报错,解决办法是关闭eclipse的js校验功能. 三个步骤: 1. 右键点击项目->properties->Validation ...
- 配置IIS提示打开目录浏览时的问题:未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的解决办法
错误消息: 未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的 ...
- Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)
当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...
- Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解决办法
问题: 使用 AS 在 Fragment 中调用 getActivity() 方法的时候会出现可能为空指针的提醒 使用 monkey 多次十万次测试,会出现 getActivity() NullPoi ...
- linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法
linux中没有dos2UNIX或者UNIX2dos命令怎么解决办法 http://blog.csdn.net/w616589292/article/details/38274475 dos2unix ...
随机推荐
- Spark2.0基于广播变量broadcast实现实时数据按天统计
package com.gm.hive.SparkHive; import java.text.SimpleDateFormat; import java.util.Arrays; import ja ...
- linux中的一些常用命令
shutdown -h now 现在马上关机 shutdown -r now 现在重新启动 reboot 现在重新启动 su - 如果当前是普通用户,则输入这条命令切换到管理员用户(root),如果要 ...
- day01-html
HTML概述: HTML: Hyper Text Markup Language 超文本标记语言 超文本: 比普通文本功能更加强大,可以添加各种样式 标记语言: 通过一组标签.来对内容进行描述. &l ...
- Mysql 数据库中9大对象
MySql 数据库9中对象1.表2.索引3.视图4.图表:数据库表之间的关系视图,并不常用5.规则6.缺省值:数据列的默认值7.触发器8.存储过程9.用户
- 树——binary-tree-postorder-traversal(树的前序遍历)
问题: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given bina ...
- 使用国外 DNS 造成国内网站访问慢的解决方法
本文原载于 wzyboy's blog,转载请注明本文地址: https://wzyboy.im/post/874.html ,谢谢合作. 为什么要用国外 DNS 由于众所周知的问题,国内 DNS 服 ...
- [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
Problems meet in the project: [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序((IM002) [Microso ...
- 前端每日实战:91# 视频演示如何用纯 CSS 创作一个行驶中的火车 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RBLWzJ 可交互视频 此视频是可 ...
- Clean Docker <none>:<none>
https://www.projectatomic.io/blog/2015/07/what-are-docker-none-none-images/ Reference: https://www.p ...
- redis学习 --Hash
一:我们可以将Redis中的Hash类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Age等.如果H ...