use*_*091 11 php ip networking
我需要检查文件是否"本地"打开(相同的机器或网络).我正在使用:
<?php
if ((substr($_SERVER['REMOTE_ADDR'],0,8) == "192.168.") || ($_SERVER['REMOTE_ADDR'] == "127.0.0.1")) {
// client is local
} else {
// client is not local
}
Run Code Online (Sandbox Code Playgroud)
但我不确定这是最好的方法.
这样做有什么更简单的方法?
Mig*_*ias 46
Friek说的是真的,但如果您知道如何获得真实客户端的IP,您可以使用PHP过滤器判断它是否是本地地址:
if ( ! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) )
{
// is a local ip address
}
Run Code Online (Sandbox Code Playgroud)
"万无一失",一如既往,可能会很棘手.
如果我们将自己限制为IPv4,那么检查"127.0.0.1"会处理localhost情况,但检查"192.168".是完全错误的 - 只有在使用16位子网掩码的192.168网络上的服务器上运行脚本时,它才会起作用.
检查$ _SERVER ['REMOTE_ADDR']对$ _SERVER ['SERVER_ADDR']将是一个更好的选择.但是,这仍然不能解决多宿主主机(即除了127.0.0.1之外还有多个IP地址的主机)的情况.
为了捕获所有相同网络的情况,您需要检查SERVER_ADDR和子网掩码与REMOTE_ADDR的组合,但子网掩码在$ _SERVER中不可用.
但我发现一个函数,确实几乎你想要的这里.这是几个屏幕,它被称为clientInSameSubnet.不是我的代码,但看起来正确.
如果有人找不到@Uffe 建议的上述代码,我将其包含在下面:
<?php
/**
* Check if a client IP is in our Server subnet
*
* @param string $client_ip
* @param string $server_ip
* @return boolean
*/
function clientInSameSubnet($client_ip=false,$server_ip=false) {
if (!$client_ip)
$client_ip = $_SERVER['REMOTE_ADDR'];
if (!$server_ip)
$server_ip = $_SERVER['SERVER_ADDR'];
// Extract broadcast and netmask from ifconfig
if (!($p = popen("ifconfig","r"))) return false;
$out = "";
while(!feof($p))
$out .= fread($p,1024);
fclose($p);
// This is to avoid wrapping.
$match = "/^.*".$server_ip;
$match .= ".*Bcast:(\d{1,3}\.\d{1,3}i\.\d{1,3}\.\d{1,3}).*";
$match .= "Mask:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/im";
if (!preg_match($match,$out,$regs))
return false;
$bcast = ip2long($regs[1]);
$smask = ip2long($regs[2]);
$ipadr = ip2long($client_ip);
$nmask = $bcast & $smask;
return (($ipadr & $smask) == ($nmask & $smask));
}
Run Code Online (Sandbox Code Playgroud)