我对许多AJAX调用运行安全检查,以查看是否有记录在案的相同IP请求。
我使用了以下一组类函数来建立IP(可以通过负载平衡器来实现,因此采用了纵向方法)。
private function IPMask_Match ($network, $ip) {
$ip_arr = explode('/', $network);
if (count($ip_arr) < 2) {
$ip_arr = array($ip_arr[0], null);
}
$network_long = ip2long($ip_arr[0]);
$x = ip2long($ip_arr[1]);
$mask = long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]);
$ip_long = ip2long($ip);
return ($ip_long & $mask) == ($network_long & $mask);
}
private function IPCheck_RFC1918 ($IP) {
$PrivateIP = false;
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('127.0.0.0/8', $IP);
}
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('10.0.0.0/8', $IP);
}
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('172.16.0.0/12', $IP);
}
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('192.168.0.0/16', $IP);
}
return $PrivateIP;
}
public function getIP () {
$UsesProxy = (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) || !empty($_SERVER['HTTP_CLIENT_IP'])) ? true : false;
if ($UsesProxy && !empty($_SERVER['HTTP_CLIENT_IP'])) {
$UserIP = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ($UsesProxy && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$UserIP = $_SERVER['HTTP_X_FORWARDED_FOR'];
if (strstr($UserIP, ',')) {
$UserIPArray = explode(',', $UserIP);
foreach ($UserIPArray as $IPtoCheck) {
if (!$this->IPCheck_RFC1918($IPtoCheck)) {
$UserIP = $IPtoCheck;
break;
}
}
if ($UserIP == $_SERVER['HTTP_X_FORWARDED_FOR']) {
$UserIP = $_SERVER['REMOTE_ADDR'];
}
}
}
else{
$UserIP = $_SERVER['REMOTE_ADDR'];
}
return $UserIP;
}
问题是,我的用户通过代理进行操作时遇到了问题。有人能说明原因吗?我已经使用基本免费代理的在线尝试和模拟,但它似乎没有得到可变IP或任何东西-所以我不知道为什么这会说这两个IP不匹配。
一个朋友发现了这一点,基本上一些代理可以返回X_FORWARDED_FOR作为逗号分隔的值,或者作为逗号分隔和间隔。
要修复:-
之后:
foreach ($UserIPArray as $IPtoCheck) {
添加此行:
$IPtoCheck = trim($IPtoCheck);
排序。
不幸的是,问题几乎肯定不是代理——它几乎肯定是一个固定的公共知识产权路由器,通过子网路由流量。
子网可以是巨大的(比如在大学)。
而且,即使是出于某种侥幸,它是一个真正的代理(它们现在很少见——10年前的技术),即使代理自愿转发,它也不会有任何意义,因为它几乎肯定是一个类似192.168.x.x的子网ip。。这基本上是公共IP地址(又名交换机)的内部扩展。
您可以交叉手指,尝试使用php ipv6在php中使用ipv6地址,或者更聪明地尝试使用mac地址如何在php中获取已连接客户端的mac和IP地址?但两者都注定要失败。我的直觉是试图欺骗:我敢打赌,最好的方法基本上是为会话存储使用网络共享,并允许负载平衡的PHP服务器都通过相同的dns前缀访问它并执行所有操作。或者可能设置一个第三方dns来进行会话收集。
答案是,除非你像广告公司一样用“饼干”跟踪,否则你做不到。
我将首先解释什么是代理,所以我们都在同一页上。
什么是代理
代理通常是一台代表用户访问互联网的计算机,然后代理将结果发送回用户。当可能有数百甚至数千人也在使用那台计算机时,问题就出现了——他们都有相同的IP地址,但通常标头表明用户是通过代理。
我假设您的脚本(没有正确查看)正在将IP和头混淆。
不同的解决方案
有更好的办法。使用会话并在会话中保存一个密钥,确保它们在访问ajax页面之前先访问过主站点。例子:
index.php
session_start();
$_SESSION['ajax_ok'] = true;
ajax/username\u check.php
session_start();
if (empty($_SESSION['ajax_ok'])) {
die("You can not access this page...");
}
这将强制他们必须首先访问您的主站点,并且客户端还必须支持大多数浏览器都支持的会话,这有助于防止机器人程序等滥用您的ajax脚本。
比使用上面那堆乱七八糟的代码更可靠、更简单的解决方案
如果你不能使用会话怎么办?
如果您不能在您所在的特定comp上使用会话,您可以安装另一台计算机,重写会话处理程序(使用php提供的回调),或者使用其他类似数据库的方法来代替文件系统来进行会话?你的网站一定有一些东西可以让会议使用。例如,如果您有一个负载平衡器,那么基于文件的会话通常无法正常工作,因此通常最好将会话更改为使用我上面提到的其他会话。
本文向大家介绍PHP 获取ip地址代码汇总,包括了PHP 获取ip地址代码汇总的使用技巧和注意事项,需要的朋友参考一下 代码一: 代码二: 方法三: 方法四: 方法五: 方法六:
问题内容: 我的任务是对詹金斯的一些工作进行健康检查。这个想法是通过Jenkins rest API获取作业的状态和关联的IP地址,因此我可以使用该信息与另一个Restful API进行接口。我创建了一个Groovy脚本,该脚本成功解析了Jenkins作业并获取了它们的状态(无论它们是否正在运行),但是我还没有找到一种将这些作业与其IP地址关联的方法。有没有办法通过其余的API获取Jenkins中
本文向大家介绍通过PHP实现获取访问用户IP,包括了通过PHP实现获取访问用户IP的使用技巧和注意事项,需要的朋友参考一下 在php中自带了一个非常的简单的获取IP地址的全局变量,很多初学都获取IP都使用它了,但是对于这些我们一般用法是满足了,但是对于要求高精度这个函数还是不行的。 这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了: $
本文向大家介绍iOS获取手机ip地址代码,包括了iOS获取手机ip地址代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了iOS获取手机ip地址的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
问题内容: 我知道对此问题的最初反应是“否”和“无法完成”,并且“您不需要它,您做错了什么”。我正在尝试获取用户的LAN IP地址,并将其显示在网页上。为什么?因为这就是我正在处理的页面的全部内容,因此会显示有关您的尽可能多的信息 因此,除了向用户展示以供参考之外,我实际上并没有对IP做任何事情。我曾经通过使用一个小的Java小程序来做到这一点。效果很好。但是这些天来,浏览器让您多次达成共识和信任
问题内容: 我想获取使用我网站的客户IP地址。我正在使用PHP superglobal: 但是我看到它不能使用此提供正确的IP地址。我得到了我的IP地址,发现它与我的IP地址不同,并且我还可以在某些网站上看到我的IP地址,例如: 我粘贴了提供PHP功能的IP地址,但是此网站未显示任何结果。这个问题是怎么发生的,如何获得客户端的IP地址? 问题答案: 获取访问者/客户的IP地址的最简单方法是使用或变