我有两个vps,在我的vps_ip1上构建sshd并在本地机器上的Firefox中安装自动代理插件,将some_domain与vps_ip2绑定,并将read.php放在vps_ip2上。
<?php
echo $_SERVER['REMOTE_ADDR'];
echo "<br>";
echo $_SERVER['REQUEST_TIME'];
echo "<br>";
echo $_SERVER['HTTP_X_FORWARDED_FOR'];
echo "<br>";
echo $_SERVER['HTTP_CLIENT_IP'];
?>
现在我的本地ip是ip0,我用ssh连接vps_ip1并启动自动代理,什么时候在Firefox中输入some_domain/read.php
,得到闪光输出:
vps_ip1
1426332103
$_SERVER['HTTP_X_FORWARDED_FOR']
和$_SERVER['HTTP_CLIENT_IP']
对我的ip0一无所知。
如何使用一些 php 函数获取我的本地 ip0?
您需要阅读代理以及它们可以以何种方式运行。特别是阅读有关匿名代理的部分。
简而言之,根据代理服务器的配置,它可能不会提供原始 IP,以保护客户端的匿名性。
HTTP_X_FORWARDED_FOR只保存代理服务器自愿为您提供的任何数据。可能什么都不是。它可能是客户端的公共 IP。它可能是客户端的本地 (lan) IP。它可能是带有或不带有客户端的前面/链接代理的逗号分隔列表。它甚至可能是任何欺骗性 IP。
最后,您不能只信任任何代理服务器以及它在HTTP_X_FORWARDED_FOR标头中为您提供的内容,或者即使它为您提供了任何东西。
因此,现在您需要检查安装在vps_ip1上的代理服务器并禁用匿名功能。
<?php
if (!empty($_SERVER["HTTP_CLIENT_IP"]))
{
//check for ip from share internet
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
{
// Check for the Proxy User
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
else
{
$ip = $_SERVER["REMOTE_ADDR"];
}
// This will print user's real IP Address
// does't matter if user using proxy or not.
echo $ip;
?>
你必须使用命令查看$_SERVER
数组的内容
print_r($_SERVER);
并找到哪个变量使用您的代理来传输您的本地 IP。
根据您的代理服务器,它可以是以下任何一种可能性:HTTP_X_FORWARDED
、HTTP_X_FORWARDED
、HTTP_FORWARDED_FOR
、HTTP_FORWARDED
、HTTP_CLIENT_IP
、HTTP_FORWARDED
或其他任何东西。
有关检索 IP 的快速方法,请参阅以下问题:在 PHP 中检索用户正确 IP 地址的最准确方法是什么?