获取客户端ip其实不是个简单的活儿,因为存在Ip欺骗,和代理问题,所以获取客户端的IP的真实性会打折扣的,不能百分百准确.但是我们还是尽量找一个比较完善的获取客户端真正ip方法.使用PHP获取IP的方法能找到很多.
getIp
- function getIp() {
- if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP");
- else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR");
- else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR");
- else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR'];
- else $ip = "unknown";
- 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的欺骗,和多重代理代码.方法相类似.
- function getip() {
- $unknown = 'unknown';
- if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)) {
- $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
- }
- elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) {
- $ip = $_SERVER['REMOTE_ADDR'];
- }
- /*
- 处理多层代理的情况
- 或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
- */
- if (false !== strpos($ip, ',')) $ip = reset(explode(',', $ip));
- 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(); |
2.php代码:
代码如下 | 复制代码 |
function getClientIp() { 用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方法后,发现有个共同规律,主要核心就是
- HTTP_CLIENT_IP
- HTTP_X_FORWARDED_FOR
- 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地址 结合HTTP扩展请求头 X-Forwarded-For 可以对客户端IP进行伪造 X-Forwarded-For 是一个 HTTP 扩展头部,用来表示HTTP请求端真实 IP,HTTP/1.1 协议并没有对它的定义,但现如今X-Forwarded-...
在ASP.NET中,获取客户端的IP地址是常见的需求,...但同时,要注意处理代理服务器、IP伪造及隐私保护等问题,确保代码的健壮性和合规性。在Ch2_3的相关文件中,可能包含更详细的代码示例和讲解,建议进一步查阅学习。
另一个例子展示了如何同时伪造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 function get_client_ip() { if (isset($_SERVER['REMOTE_ADDR'])) { $cip = $_SERVER['REMOTE_ADDR']; } elseif (function_...
在互联网应用开发中,获取用户的真实IP地址是基础且重要的功能之一。本文汇总了6种使用PHP语言获取IP地址的方法,这些方法各有特点,适用于不同的场景和需求。 方法一使用了`$_SERVER`全局数组,这是PHP中一个自动...
服务器端可能会有多种策略来检测和验证真实IP,例如: - 检查"X-Forwarded-For"头的来源,只信任特定的信任链。 - 使用cookie或session来关联IP和用户,如果IP改变,可能会引发异常。 - 针对特定的IP行为模式,如...
在分享的代码中,首先通过`getenv`和`$_SERVER`获取客户端IP地址,然后对获取到的IP地址进行判断。代码中首先尝试获取`HTTP_CLIENT_IP`环境变量,如果存在且不等于"unknown",则说明是客户端IP;如果不存在,则尝试...
本文还提到了一些先前的研究工作,包括通过检测跳数异常来过滤伪造IP数据包的HCF方法,以及基于不同约束条件的IP数据包反向探测定位技术等。尽管这些方法各有优势,但在应对复杂的网络环境和高级的伪造手段时仍存在...
Python爬虫请求伪造技术是网络数据抓取领域中一种常用的方法,主要目的是为了模拟真实用户的行为,使得服务器难以识别出请求来自于爬虫程序。在实际应用中,这通常涉及到HTTP头的修改,如User-Agent、Cookie等,以及...
以上只是部分常见的反爬虫机制,实际上还有很多其他方法,例如User-Agent伪造、Cookies管理、请求间隔控制等,使得爬虫开发变得更加复杂。通过这篇文章,你不仅能够了解到Python爬虫的基础知识和一些常用库的应用,...
IP欺骗是一种高级的攻击技术,攻击者利用假IP地址进行网络活动,以隐藏真实身份。通过IP欺骗,攻击者可以发起DoS攻击(如Smurf攻击、SYN洪水攻击等),破坏网络服务或造成网络拥塞。IP欺骗还可以用于更复杂的攻击,...
被动攻击则是数据窃听或流量分析,不改变信息但获取信息内容。 2. 数据完整性:确保数据在传输过程中未被修改,保证接收方接收到的信息与发送方发送的信息完全一致。 3. 非对称算法:RSA算法是非对称加密的一个...
SPF记录告诉其他邮件服务器哪些IP地址被授权代表你的域发送邮件,而DKIM则通过数字签名增加邮件的真实性,防止垃圾邮件和伪造邮件。 另外,你可能还需要考虑反垃圾邮件和防病毒策略,例如安装Amavisd-new和ClamAV,...
- DHCP(动态主机配置协议)服务允许网络中的计算机自动获取IP地址,它的优点包括节约IP地址资源和自动分配地址,所以试题9中不属于DHCP服务优点的是B(安全可靠)。 - URL(统一资源定位符)是网络上资源的地址,...
不能攻破防火墙外面的这台服务器,他就无法打破防火墙,或者这时他就会尝试获取这两台 主机之间的信任关系。 第一步就是对防火墙外面的这台可信主机发起 S N Y泛洪,以阻止其响应任何新的网络会 话。攻击者而后...
在知乎的例子中,`_xsrf`字段用于防止跨站请求伪造(CSRF)攻击,其值可以通过分析登录页面的HTML获取。 以下是一个简单的Python代码示例,展示如何模拟登录知乎: ```python import urllib2 import urllib import...
在测试等场景下,有时需要伪造消息来模拟真实的服务交互。 #### 7.15 节点间消息通信 Skynet支持跨节点的消息通信,这对于分布式系统的实现非常重要。 ### Multicast组播 Multicast技术允许一条消息被广播到多个...