PHP:如何检查客户端是否是本地的


PHP: how to check if the client is local?

我需要检查文件是否在"本地"打开(同一机器或网络)。我使用:

<?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
}

但我不确定这是最好的方法。

还有什么更万无一失的方法呢?

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
}

"万无一失",一如既往,可能会很棘手。

如果我们将自己限制为IPv4,那么检查"127.0.0.1"会处理本地主机的情况,但是检查"192.168."是完全错误的-它只会在脚本运行在恰好在192.168网络上的服务器上,使用16位子网掩码。

检查$_SERVER['REMOTE_ADDR']和$_SERVER['SERVER_ADDR']将是一个更好的选择。但是,这仍然不能处理多宿主主机(即除了127.0.0.1之外还有几个IP地址的主机)的情况。

为了捕获所有相同网络的情况,您需要根据REMOTE_ADDR检查SERVER_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));
}