`
m635674608
  • 浏览: 5042781 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

获取真实IP的方法,以及伪造IP的例子代码

 
阅读更多
内容提要:这种情况下同样透露了客户端是使用了代理服务器,但编造了一个虚假的随机IP(220.4.251.159)代替客户端的真实IP来欺骗它……

  获取客户端ip其实不是个简单的活儿,因为存在Ip欺骗,和代理问题,所以获取客户端的IP的真实性会打折扣的,不能百分百准确.但是我们还是尽量找一个比较完善的获取客户端真正ip方法.使用PHP获取IP的方法能找到很多.

getIp

  1. function getIp() { 
  2.     if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); 
  3.     else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); 
  4.     else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); 
  5.     else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; 
  6.     else $ip = "unknown"
  7.     return ($ip); 

  现在需要对这段代码进行解释,这里用到了两个函数,getenv()和strcasecmp(),前一个函数获取得系统的环境变量,如果能取到值,则返回该值,不能则返回false.

  $_SERVER是服务器超级全局变量数组,用$_SERVER['REMOTE_ADDR']同样可以获取到客户端的IP地址.二者的区别在于,getenv不支持IIS的isapi方式运行的php.

  strcasecmp(string1,string2)字符串函数的用法是把string1和string2进行比较,如果相等返回0,如果string1大于string2,返回大于0的数,小于则返回小于0的数.

  函数先使用客户IP,如果不成立尝试用代理的方法,如果不行,再使用REMOTE_ADDR.还看到过一个检测IP更详细的方法,考虑了IP的欺骗,和多重代理代码.方法相类似.

  1. function getip() { 
  2.     $unknown = 'unknown'
  3.     if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)) { 
  4.         $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
  5.     } 
  6.     elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) { 
  7.         $ip = $_SERVER['REMOTE_ADDR']; 
  8.     } 
  9.     /*  
  10. 处理多层代理的情况  
  11. 或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;  
  12. */ 
  13.     if (false !== strpos($ip, ',')) $ip = reset(explode(',', $ip)); 
  14.     return $ip; 

一、没有使用代理服务器的PHP获取客户端IP情况:

    REMOTE_ADDR = 客户端IP
    HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

    REMOTE_ADDR = 最后一个代理服务器 IP
    HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)
    这类代理服务器还是将客户端真实的IP发送给了访问对象,无法达到隐藏真实身份的目的.

三、使用普通匿名代理服务器的PHP获取客户端IP情况:Anonymous Proxies

    REMOTE_ADDR = 最后一个代理服务器 IP
    HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)
    这种情况下隐藏了客户端的真实IP,但是向访问对象透露了客户端是使用代理服务器访问它们的.

四、使用欺骗性代理服务器的情况:Distorting Proxies

    REMOTE_ADDR = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)
    这种情况下同样透露了客户端是使用了代理服务器,但编造了一个虚假的随机IP(220.4.251.159)代替客户端的真实IP来欺骗它.

五、使用高匿名代理服务器的PHP获取客户端IP情况:High Anonymity Proxies (Elite proxies)

    REMOTE_ADDR = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 没数值或不显示

    无论是REMOTE_ADDR还是HTTP_FORWARDED_FOR,这些头消息未必能够取得到,因为不同的浏览器不同的网络设备可能发送不同的IP头消息.因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值.

 

 

-----------------------------------------------------------------------------------------测试例子----------------------------------------------------------------------------------------------------

REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

下面是测试代码:

服务端获取IP地址 http://ip.itlearner.com/ 其代码如下:

$s_onlineip = getenv(‘HTTP_CLIENT_IP’);
echo “HTTP_CLIENT_IP:”.$s_onlineip.”<br/>\n”;
$s_onlineip = getenv(‘HTTP_X_FORWARDED_FOR’);
echo “HTTP_X_FORWARDED_FOR:”.$s_onlineip.”<br/>\n”;
$s_onlineip = getenv(‘REMOTE_ADDR’);
echo “REMOTE_ADDR:”.$s_onlineip.”<br/>\n”;
$s_onlineip = $_SERVER['REMOTE_ADDR'];
echo “\$_SERVER['REMOTE_ADDR']:”.$s_onlineip.”<br/>\n”;

客户端代码:
伪造IP测试:

$url = ‘http://ip.itlearner.com/’;
$data_string = ‘test=test’;
$URL_Info = parse_url($url);
$request = ”;
if (!isset($URL_Info["port"]))
$URL_Info["port"]=80;
$request.=”POST “.$URL_Info["path"].” HTTP/1.1\n”;
$request.=”Host: “.$URL_Info["host"].”\n”;
$request.=”Referer: “.$URL_Info["host"].”\n”;
$request.=”Content-type: application/x-www-form-urlencoded\n”;
$request.=”X-Forwarded-For:192.168.1.4\n”;//HTTP_X_FORWARDED_FOR的值
$request.=”client_ip:192.168.1.5\n”;//HTTP_CLIENT_IP的值
$request.=”Content-length: “.strlen($data_string).”\n”;
$request.=”Connection: close\n”;
$request.=”\n”;
$request.=$data_string.”\n”;

$fp = fsockopen($URL_Info["host"], $URL_Info["port"]);
fputs($fp, $request);
$result = ”;
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
fclose($fp);
echo $result;

输出:

HTTP_CLIENT_IP:192.168.1.5
HTTP_X_FORWARDED_FOR:192.168.1.4
REMOTE_ADDR:127.0.0.1
$_SERVER['REMOTE_ADDR']:127.0.0.1

代理IP测试:

$cUrl = curl_init();
curl_setopt($cUrl, CURLOPT_URL, $url);
curl_setopt($cUrl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cUrl, CURLOPT_HEADER, 1);
curl_setopt($cUrl, CURLOPT_USERAGENT, “Mozilla/99.99″);
//curl_setopt($cUrl, CURLOPT_TIMEOUT, 10);
curl_setopt($cUrl, CURLOPT_PROXY, ’125.77.194.103:80′);
$c = curl_exec($cUrl);
curl_close($cUrl);
echo $c;

输出:

HTTP_CLIENT_IP:
HTTP_X_FORWARDED_FOR:
REMOTE_ADDR:125.77.194.103
$_SERVER['REMOTE_ADDR']:125.77.194.103

--------------------------------------------------------------------------------------------------伪造2--------------

伪造IP来源对于php来说是很简单的一件事情,我们只要利用了php curl即可实现伪造IP来源哦,IP地址你可以随便写哦。

实例

 代码如下 复制代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));//IP
curl_setopt($ch, CURLOPT_REFERER, "http://www.hzhuti.com/ ");   //来路
curl_setopt($ch, CURLOPT_HEADER, 1);
$out = curl_exec($ch);
curl_close($ch);

2.php代码:

 代码如下 复制代码

function getClientIp() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"]))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "err";
    return $ip;
}
echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER["HTTP_REFERER"];

用1.php 请求 2.php,输出结果:

IP:8.8.8.8  referer:http://www.hzhuti.com

伪造成功,这是不是给采集的朋友提供了很好的换IP的方案!!当然防被刷的朋友也要注意了

PHP中的CURL函数库(Client URL Library Function)

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

 

---------------------------------------------相关阅读--------------------------------------------------------

 

PHP世界不算漏洞的漏洞 - 你永远获得不到我的真实IP

 

我粗略列举6种PHP业内、国际各大开源系统获取用户真实IP的案例(包括Magento Zencart Zend Framework Yii...国内的就不提了吧!通杀!):

PHP获取用户真实IP方法1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
  $cip = $_SERVER["HTTP_CLIENT_IP"];
}
elseif(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){
  $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
elseif(!empty($_SERVER["REMOTE_ADDR"])){
  $cip = $_SERVER["REMOTE_ADDR"];
}
else{
  $cip = "无法获取!";
}
return $cip;
}
echo GetIP();
?>

PHP获取用户真实IP方法2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
error_reporting (E_ERROR | E_WARNING | E_PARSE);
if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]){
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]){
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]){
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (getenv("HTTP_X_FORWARDED_FOR")){
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (getenv("HTTP_CLIENT_IP")){
$ip = getenv("HTTP_CLIENT_IP");
}
elseif (getenv("REMOTE_ADDR")){
$ip = getenv("REMOTE_ADDR");
}
else{
$ip = "Unknown";
}
echo $ip;
?>

 

 


PHP获取用户真实IP方法3:

1
2
3
4
<?php
$iipp = $_SERVER["REMOTE_ADDR"];
echo $iipp ;
?>

 

 

PHP获取用户真实IP方法4:

1
2
3
4
5
<?php
$user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
echo $user_IP
?>

 

 

PHP获取用户真实IP方法5:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function get_real_ip()
{
$ip=false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
  $ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
  $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
  if($ip){
   array_unshift($ips, $ip); $ip = FALSE;
  }
  for($i = 0; $i < count($ips); $i++){
   if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i])){
    $ip = $ips[$i];
    break;
   }
  }
}
return($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
echo get_real_ip();
?>

 

 

PHP获取用户真实IP方法6:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if(getenv('HTTP_CLIENT_IP')){
$onlineip = getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR')){
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('REMOTE_ADDR')){
$onlineip = getenv('REMOTE_ADDR');
}
else{
$onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
echo $onlineip;
?>

获取用户真实IP原理:

客官看完了业界常用的获取用户真实IP方法后,发现有个共同规律,主要核心就是

  1. HTTP_CLIENT_IP
  2. HTTP_X_FORWARDED_FOR
  3. REMOTE_ADDR

不同的演变,只是代码兼容性罢了!

如何模拟用户真实IP?

问:如果可以伪造模拟HTTP_CLIENT_IP,伪造模拟HTTP_X_FORWARDED_FOR,伪造模拟REMOTE_ADDR,不就可以达到追踪不到用户真实IP的目的了么?

答:楼上理解完全正确!如果做到这样完全可以通杀99%的获取用户真实IP,以用户IP为标识的系统!

支招【LET采集技巧】(curl、socket、fsocketopen、stream_socket_client):

如何模拟HTTP_CLIENT_IP?HTTP_CLIENT_IP可以模拟么?伪装HTTP_CLIENT_IP!

 

1
2
3
curl_setopt($curl, CURLOPT_HTTPHEADER, array (
            'Client_Ip: '.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255),
));//优点:伪造成本低,通杀90%系统

 

如何模拟HTTP_X_FORWARDED_FOR?HTTP_X_FORWARDED_FOR可以模拟么?伪装HTTP_X_FORWARDED_FOR!

 

1
2
3
curl_setopt($curl, CURLOPT_HTTPHEADER, array (
            'X-Forwarded-For: '.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255),
));//优点:伪造成本低,通杀90%系统

 

如何模拟REMOTE_ADDR?REMOTE_ADDR可以模拟么?伪装REMOTE_ADDR!

 

 

1
2
3
curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($curl, CURLOPT_PROXY, '1.1.1.1:8080');//自行百度获得普匿代理IP即可,高匿代理IP更佳!
//优点:通杀100%系统

 

 

http://blog.csdn.net/qq_15766181/article/details/50605959

分享到:
评论

相关推荐

    易语言伪造请求ip 伪造请求ip 网页访问伪造ip

    易语言伪造网页访问ip地址 结合HTTP扩展请求头 X-Forwarded-For 可以对客户端IP进行伪造 X-Forwarded-For 是一个 HTTP 扩展头部,用来表示HTTP请求端真实 IP,HTTP/1.1 协议并没有对它的定义,但现如今X-Forwarded-...

    获取客户端的IP地址

    在ASP.NET中,获取客户端的IP地址是常见的需求,...但同时,要注意处理代理服务器、IP伪造及隐私保护等问题,确保代码的健壮性和合规性。在Ch2_3的相关文件中,可能包含更详细的代码示例和讲解,建议进一步查阅学习。

    php curl 伪造IP来源的实例代码

    另一个例子展示了如何同时伪造IP和来源页面(`referer`): ```php // 1.php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-...

    php 获取本地IP代码

    下面给出的PHP代码片段就是一个例子,它尝试通过多个途径获取客户端IP: ```php function get_client_ip() { if (isset($_SERVER['REMOTE_ADDR'])) { $cip = $_SERVER['REMOTE_ADDR']; } elseif (function_...

    PHP 获取ip地址代码汇总

    在互联网应用开发中,获取用户的真实IP地址是基础且重要的功能之一。本文汇总了6种使用PHP语言获取IP地址的方法,这些方法各有特点,适用于不同的场景和需求。 方法一使用了`$_SERVER`全局数组,这是PHP中一个自动...

    HTTP协议伪装IP源码例子延时-易语言

    服务器端可能会有多种策略来检测和验证真实IP,例如: - 检查"X-Forwarded-For"头的来源,只信任特定的信任链。 - 使用cookie或session来关联IP和用户,如果IP改变,可能会引发异常。 - 针对特定的IP行为模式,如...

    php中限制ip段访问、禁止ip提交表单的代码分享

    在分享的代码中,首先通过`getenv`和`$_SERVER`获取客户端IP地址,然后对获取到的IP地址进行判断。代码中首先尝试获取`HTTP_CLIENT_IP`环境变量,如果存在且不等于"unknown",则说明是客户端IP;如果不存在,则尝试...

    被动式伪造IP数据流地理信息获取技术研究 (2011年)

    本文还提到了一些先前的研究工作,包括通过检测跳数异常来过滤伪造IP数据包的HCF方法,以及基于不同约束条件的IP数据包反向探测定位技术等。尽管这些方法各有优势,但在应对复杂的网络环境和高级的伪造手段时仍存在...

    python爬虫请求伪造技术资源.zip

    Python爬虫请求伪造技术是网络数据抓取领域中一种常用的方法,主要目的是为了模拟真实用户的行为,使得服务器难以识别出请求来自于爬虫程序。在实际应用中,这通常涉及到HTTP头的修改,如User-Agent、Cookie等,以及...

    ## 爬虫基础知识、爬虫实例与反爬机制详解

    以上只是部分常见的反爬虫机制,实际上还有很多其他方法,例如User-Agent伪造、Cookies管理、请求间隔控制等,使得爬虫开发变得更加复杂。通过这篇文章,你不仅能够了解到Python爬虫的基础知识和一些常用库的应用,...

    攻击技术分类研究

    IP欺骗是一种高级的攻击技术,攻击者利用假IP地址进行网络活动,以隐藏真实身份。通过IP欺骗,攻击者可以发起DoS攻击(如Smurf攻击、SYN洪水攻击等),破坏网络服务或造成网络拥塞。IP欺骗还可以用于更复杂的攻击,...

    计算机网络安全试题-《网络安全与管理(第二版)》网络安全试题(2).doc

    被动攻击则是数据窃听或流量分析,不改变信息但获取信息内容。 2. 数据完整性:确保数据在传输过程中未被修改,保证接收方接收到的信息与发送方发送的信息完全一致。 3. 非对称算法:RSA算法是非对称加密的一个...

    centos4.6 mail邮件服务器.doc

    SPF记录告诉其他邮件服务器哪些IP地址被授权代表你的域发送邮件,而DKIM则通过数字签名增加邮件的真实性,防止垃圾邮件和伪造邮件。 另外,你可能还需要考虑反垃圾邮件和防病毒策略,例如安装Amavisd-new和ClamAV,...

    国家开放大学《网络实用技术基础》形考3答案.pdf

    - DHCP(动态主机配置协议)服务允许网络中的计算机自动获取IP地址,它的优点包括节约IP地址资源和自动分配地址,所以试题9中不属于DHCP服务优点的是B(安全可靠)。 - URL(统一资源定位符)是网络上资源的地址,...

    TCP拦截和网络地址转换

    不能攻破防火墙外面的这台服务器,他就无法打破防火墙,或者这时他就会尝试获取这两台 主机之间的信任关系。 第一步就是对防火墙外面的这台可信主机发起 S N Y泛洪,以阻止其响应任何新的网络会 话。攻击者而后...

    Python 爬虫模拟登陆知乎

    在知乎的例子中,`_xsrf`字段用于防止跨站请求伪造(CSRF)攻击,其值可以通过分析登录页面的HTML获取。 以下是一个简单的Python代码示例,展示如何模拟登录知乎: ```python import urllib2 import urllib import...

    王桂林--Skynet.pdf

    在测试等场景下,有时需要伪造消息来模拟真实的服务交互。 #### 7.15 节点间消息通信 Skynet支持跨节点的消息通信,这对于分布式系统的实现非常重要。 ### Multicast组播 Multicast技术允许一条消息被广播到多个...

Global site tag (gtag.js) - Google Analytics