1. REMOTE_ADDR:是和服务器直接"握手"的IP。
  2. HTTP_CLIENT_IP:代理服务器添加的 HTTP 头,存放客户端真实IP。
  3. HTTP_X_FORWARDED_FOR:代理服务器添加的HTTP头,存放真实ip和各级代理ip。格式为X-Forwarded-For: client1, proxy1, proxy2。

http请求头可以伪造,不仅代理可以,客户端也可以。
REMOTE_ADDR也可以伪造,通过伪造tcp握手包,Response将会发送给被伪造的IP,所以这个层面的伪造ip没有意义。

phpcms中的获取ip函数:

 function ip() {
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$ip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$ip = $_SERVER['REMOTE_ADDR'];
}
return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
}

它首先取 HTTP_CLIENT_IP ,然后取 HTTP_X_FORWARDED_FOR,上述都取不到的情况下才去取 REMOTE_ADDR。可前两个都能在客户端伪造。所以这个次序不行。

来看一看如何伪造。
ip_request.php:

 <?php
$headers['CLIENT-IP'] = '2.2.2.2';
$headers['X-FORWARDED-FOR'] = '3.3.3.3,8.8.8.8';
$headerArr = array();
foreach( $headers as $n => $v ) {
$headerArr[] = $n .':' . $v;
}
ob_start();
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.my.com/ip_response.php");
curl_setopt ($ch, CURLOPT_HTTPHEADER , $headerArr ); //构造IP
curl_setopt ($ch, CURLOPT_REFERER, "http://www.163.com/ "); //构造来路
curl_setopt( $ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);//post方式发送数据
curl_exec($ch);
curl_close ($ch);
$out = ob_get_contents();
ob_clean();
echo $out;
?>

ip_response.php

 <?php
print_r($_SERVER);
?>

输出结果:

 HTTP/1.1 200 OK
Date: Wed, 08 Mar 2017 02:57:08 GMT
Server: Apache/2.4.9 (Win32) PHP/5.5.12
X-Powered-By: PHP/5.5.12
Content-Length: 2028
Connection: close
Content-Type: text/html Array
(
[HTTP_HOST] => www.my.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://www.163.com/
[HTTP_CLIENT_IP] => 2.2.2.2
[HTTP_X_FORWARDED_FOR] => 3.3.3.3,8.8.8.8
[CONTENT_TYPE] => application/x-www-form-urlencoded
[HTTP_EXPECT] => 100-continue
[PATH] => C:\Program Files\Java\jdk1.8.0_31\bin;C:\Program Files\Java\jdk1.8.0_31\jre\bin;C:\Program Files\Java\jdk1.8.0_31\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\bin;C:\Program Files (x86)\MacType;F:\Program Files\TortoiseSVN\bin;C:\Python27\;C:\Program Files\nodejs\;C:\WINDOWS\system32\config\systemprofile\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;E:\WAMP\bin\php\php5.5.12;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps
[SystemRoot] => C:\WINDOWS
[COMSPEC] => C:\WINDOWS\system32\cmd.exe
[PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
[WINDIR] => C:\WINDOWS
[SERVER_SIGNATURE] => <address>Apache/2.4.9 (Win32) PHP/5.5.12 Server at www.my.com Port 80</address> [SERVER_SOFTWARE] => Apache/2.4.9 (Win32) PHP/5.5.12
[SERVER_NAME] => www.my.com
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => E:/WAMP/www/my
[REQUEST_SCHEME] => http
[CONTEXT_PREFIX] =>
[CONTEXT_DOCUMENT_ROOT] => E:/WAMP/www/my
[SERVER_ADMIN] => admin@example.com
[SCRIPT_FILENAME] => E:/WAMP/www/my/ip_response.php
[REMOTE_PORT] => 59461
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => POST
[QUERY_STRING] =>
[REQUEST_URI] => /ip_response.php
[SCRIPT_NAME] => /ip_response.php
[PHP_SELF] => /ip_response.php
[REQUEST_TIME_FLOAT] => 1488941828.317
[REQUEST_TIME] => 1488941828
)

phpcms已跪。

php 获取真实ip的更多相关文章

  1. 阿里云SLB后Nginx、Tomcat获取真实IP

    一.SLB后Nginx如何获取真实IP 前提:nginx作为slb获取真实ip是使用 http_realip_module,默认一键安装包安装的nginx没有安装这个模块需要重新重新编译nginx并加 ...

  2. Nginx 获取真实 IP 方案

    问题根源: 基于七层的负载均衡系统,获取IP的原理都是通过XRI和XFF进行处理,从中选出“正常情况下”的源头IP,然而这两个Header都是普通的HTTP头,任何代理程序都可以轻易修改伪造它们,使得 ...

  3. nginx前端负载,后端apache获取真实IP设置

    原文链接: nginx前端负载,后端apache获取真实IP设置 参考文献: 前端Nginx,后端Apache获取用户真实IP地址  按照第二种方法设置不成功! 网站最前端是nginx,做的PROXY ...

  4. Nginx 反向代理获取真实IP问题

    一.前言 前文 Nginx 解决WebApi跨域二次请求以及Vue单页面问题 当中虽然解决了跨域问题带来的二次请求,但也产生了一个新的问题,就是如果需要获取用户IP的时候,获取的IP地址总是本机地址. ...

  5. 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;

    package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...

  6. nodejs+nginx获取真实ip

    nodejs + nginx获取真实ip分为两部分: 第一.配置nginx: 第二.通过nodejs代码获取: 其他语言也是一样的,都是配置nginx之后,在http头里面获取“x-forwarded ...

  7. JSP 获取真实IP地址的代码

    [转载]JSP 获取真实IP地址的代码 JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.   ...

  8. 003-Nginx 设置Header 获取真实IP

    1.X-Forwarded-For的定义: X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项.它 ...

  9. 【转载】JSP 获取真实IP地址的代码

    JSP 获取真实IP地址的代码 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.   但是在通过了 Apache,Squid ...

  10. CDN或负载均衡或WAF,后端服务器获取真实IP

    问题起因: 1. 后端PHP的$_SERVER["REMOTE_ADDR"]个别服务器获取不到真实IP 2. iptables 和 悬镜 等工具,设置IP黑名单不起作用 简单点说, ...

随机推荐

  1. mysql语句错误

    select * from order where id = 1; 同学问我这句话有什么问题,乍一看真看不出毛病,后来发现order是mysql关键字,这样写是不对的,所以要加一个双引号才会更好一点 ...

  2. Spring boot 自定义一个starter pom

    用过springboot的自动配置会觉得非常方便,我们完全可以自己写一个starter pom,这样不仅可以有自动配置功能,而且具有更通用的的耦合度低的配置, 新建一个starter的maven项目, ...

  3. Jackson 数据类型转换

    转载自:http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024993.html Jackson处理一般的JavaBean和Json之间的转换 ...

  4. HTML5——新表单元素 表单属性 语义元素

    表单元素 新的表单元素 datalist——输入域选项列表 keygen——提供一种验证用户的可靠方法 output——不同类型的输出,比如计算或脚本输出 表单属性 <form> / &l ...

  5. adb 性能测试(内存)

    内存测试: 1.使用数据线将手机与电脑连接: 2.手机打开待测APP,即打开进程: 3.打开cmd命令,获取设备列表:输入adb devices; 4.进入该设备的shell环境,输入:adb -s  ...

  6. Jmeter 后置处理器--jp@gc - JSON/YAML Path Extractor & JSON Extractor

    后置处理器--jp@gc - JSON/YAML Path Extractor 1.需要下载插件,地址: 解压后把对应jar包放置对应的lib和lib/ext目录下,重启Jmeter: 2.在需要提取 ...

  7. 用seborn的函数distplot(), jointplot(), pairplt()对数据的单变量分析绘图

    1.用seaborn的distplot()函数绘制直方图.参数kde = True时会把分布曲线也画出来. 如下代码所示是绘制标准正态分布的分布图 import seaborn as sns impo ...

  8. 编译中出现的undefined reference to XXX

    主要是在链接时发现找不到某个函数的实现文件.可以查找是否在makefile里没有增加待编译的.c文件,或者静态库没有引用

  9. 选择排序--python

    def findSmallest(arr): smallest = arr[0] smallest_index = 0 for i in range(1, len(arr)): if arr[i] & ...

  10. [转帖]探秘华为(二):华为和H3C(华三)的分道扬镳

    探秘华为(二):华为和H3C(华三)的分道扬镳 https://baijiahao.baidu.com/s?id=1620781715767053734&wfr=spider&for= ...