gpt4 book ai didi

php - 使用 PHP 通过代理获取 IP 地址?

转载 作者:可可西里 更新时间:2023-11-01 13:23:04 25 4
gpt4 key购买 nike

我对多个 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 不匹配。

最佳答案

我将首先解释什么是代理,以便我们都在同一页上。

什么是代理

代理通常是一台代表用户访问互联网的计算机,然后代理将结果发回给用户。当可能有成百上千甚至成百上千的其他人也在使用这台计算机时,问题就会出现——他们都拥有相同的 IP 地址,但通常 header 表明用户是通过代理访问的。

我假设(没有正确查看)您的脚本混淆了 IP 和 header 。

不同的解决方案

有更好的方法。使用 session 并在 session 中保存一个 key ,确保他们在访问 ajax 页面之前先访问过主站点。示例:

索引.php

session_start();
$_SESSION['ajax_ok'] = true;

ajax/用户名_check.php

session_start();
if (empty($_SESSION['ajax_ok'])) {
die("You can not access this page...");
}

这将强制他们必须首先访问您的主站点,并且客户端还必须支持大多数浏览器都会支持的 session ,这有助于防止机器人等滥用您的 ajax 脚本。

比使用您在上面得到的那些困惑的代码更可靠、更简单的解决方案 ><

如果不能使用 session 怎么办?

如果您不能在您所在的特定组件上使用 session ,您可以设置另一台计算机,重写 session 处理程序(使用 php 提供的回调)或者不使用文件系统,而是使用数据库等其他东西代替 session ?您的网站必须使用 session 也可以使用的东西。例如,如果您有一个基于负载均衡器文件的 session ,那么通常无论如何都无法工作,因此通常最好将 session 更改为使用我上面提到的其他内容。

关于php - 使用 PHP 通过代理获取 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12970821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com