如何检测用户是否在PHP中的localhost上?

时间:2010-01-12 23:28:15

标签: php localhost detection

换句话说,如何判断使用我的Web应用程序的人是否在其所在的服务器上?如果我没记错的话,PHPMyAdmin出于安全原因做了类似的事情。

10 个答案:

答案 0 :(得分:148)

您还可以使用$_SERVER['REMOTE_ADDR']来获取Web服务器请求的客户端IP地址。

$whitelist = array(
    '127.0.0.1',
    '::1'
);

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

答案 1 :(得分:19)

作为补充,作为一种功能......

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}

答案 2 :(得分:14)

$_SERVER["REMOTE_ADDR"]应告诉您用户的IP。但这是可以欺骗的。

查看this bounty question进行非常详细的讨论。

我认为您对PHPMyAdmin的记忆有所不同:许多MySQL服务器都配置为只能出于安全原因才能从localhost访问它们。

答案 3 :(得分:14)

较新的操作系统用户(Win 7,8)也可能会发现有必要在白名单数组中包含IPV6格式的远程地址:

$whitelist = array('127.0.0.1', "::1");

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}

答案 4 :(得分:6)

似乎你不应该使用$_SERVER['HTTP_HOST'],因为这是http标头中的值,很容易伪造。

您也可以使用$_SERVER["REMOTE_ADDR"],这是更安全的值,但也可以伪造。这个remote_addr是Apache返回结果的地址。

答案 5 :(得分:1)

如果您希望白名单/允许列表支持静态IP 动态名称

例如:

$whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com");
if (!isIPWhitelisted($whitelist)) die();

通过这种方式,您可以设置能够(肯定)检测到的名称/ IP 列表。动态名称为从不同点访问提供了更大的灵活性。

此处有两个常用选项,您可以在本地主机文件中设置名称,也可以使用可在任何地方找到的动态名称提供商。< / p>

这个函数CACHES结果是因为gethostbyname是一个非常慢的函数。

对于这个目的,我实现了这个功能:

function isIPWhitelisted($whitelist = false)
{
    if ( isset($_SESSION) && isset($_SESSION['isipallowed']) )
        { return $_SESSION['isipallowed'];  }

    // This is the whitelist
    $ipchecklist = array("localhost", "127.0.0.1", "::1");
    if ($whitelist) $ipchecklist = $whitelist;

    $iplist = false;
    $isipallowed = false;

    $filename = "resolved-ip-list.txt";
    $filename = substr(md5($filename), 0, 8)."_".$filename; // Just a spoon of security or just remove this line

    if (file_exists($filename))
    {
        // If cache file has less than 1 day old use it
        if (time() - filemtime($filename) <= 60*60*24*1)
            $iplist = explode(";", file_get_contents($filename)); // Read cached resolved ips
    }

    // If file was not loaded or found -> generate ip list
    if (!$iplist)
    {
        $iplist = array(); $c=0;
        foreach ( $ipchecklist as $k => $iptoresolve )
        {
            // gethostbyname: It's a VERY SLOW function. We really need to cache the resolved ip list
            $ip = gethostbyname($iptoresolve);
            if ($ip != "") $iplist[$c] = $ip;
            $c++;
        }

        file_put_contents($filename, implode(";", $iplist));
    }

    if (in_array($_SERVER['REMOTE_ADDR'], $iplist)) // Check if the client ip is allowed
        $isipallowed = true;

    if (isset($_SESSION)) $_SESSION['isipallowed'] = $isipallowed;

    return $isipallowed;
}

为了获得更好的可靠性,您可以将 $ _ SERVER [&#39; REMOTE_ADDR&#39;] 替换为@Pekka在{{3}中提到的 get_ip_address()作为&#34;这个赏金问题&#34;

答案 6 :(得分:0)

如何比较$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']以确定客户端是否与服务器位于同一台计算机上?

答案 7 :(得分:0)

对不起,但是所有这些答案对我来说似乎都很糟糕。我建议改一下这个问题,因为从某种意义上说,所有机器都是“本地主机”。

问题应该是;我如何运行不同的代码路径,具体取决于在哪台计算机上执行。

我认为,最简单的方法是创建一个名为DEVMACHINE的文件或您真正想要的任何文件,然后简单地检查

  

file_exists('DEVMACHINE')

在上传到实时托管环境时,请记住要排除此文件!

此解决方案不依赖于网络配置,不能被欺骗,可以轻松地在运行“实时代码”和“开发代码”之间进行切换。

答案 8 :(得分:0)

使用这个简单的 PHP 条件

if($_SERVER['HTTP_HOST'] == 'localhost')
{
    die('Localhost');
}

答案 9 :(得分:-2)

我找到了一个简单的答案。

因为所有本地驱动器都有C:或D:或F:......等等。

只检测第二个字符是否为:

if ( substr_compare(getcwd(),":",1,1) == 0)
{
echo '<script type="text/javascript">alert(" The working dir is at the local computer ")</script>';
    $client_or_server = 'client';
}
else
{
echo '<script type="text/javascript">alert(" The working dir is at the server ")</script>';
    $client_or_server = 'server';
}