109

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

4

11 回答 11

183

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

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
于 2010-01-12T23:37:34.320 回答
34

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

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
于 2014-02-11T13:13:33.237 回答
18

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

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
于 2013-09-25T18:06:00.250 回答
14

$_SERVER["REMOTE_ADDR"] should tell you the user's IP. It's spoofable, though.

Check this bounty question for a very detailed discussion.

I think what you remember with PHPMyAdmin is something different: Many MySQL Servers are configured so that they can only be accessed from localhost for security reasons.

于 2010-01-12T23:29:20.730 回答
12

我很抱歉,但所有这些答案对我来说似乎都很糟糕。我建议重新表述这个问题,因为从某种意义上说,所有机器都是“本地主机”。

问题应该是;如何根据执行的机器运行不同的代码路径。

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

file_exists('DEVMACHINE')

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

这个解决方案不依赖于网络配置,它不会被欺骗,并且可以很容易地在运行“live-code”和“dev-code”之间切换。

于 2019-04-26T10:10:33.733 回答
6

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

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

于 2011-04-26T14:16:41.547 回答
1

如果您想拥有一个支持静态 IP动态名称的白名单/白名单

例如:

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

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

您在这里有两个常用选项,您可以在本地主机文件中设置一个名称,或者您可以只使用一个可以在任何地方找到的动态名称提供程序。

这个函数 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['REMOTE_ADDR']替换为@Pekka 在他的帖子中提到的“这个赏金问题”get_ip_address()

于 2014-10-03T18:01:18.813 回答
1

使用了这个简单的 PHP 条件

if($_SERVER['HTTP_HOST'] == 'localhost')
{
    die('Localhost');
}
于 2021-02-28T14:55:41.267 回答
1

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

于 2017-05-05T12:05:35.820 回答
0

还有另一种简单的方法来检查是否是 localhost:此代码检查 ip 是在私有范围内还是在保留范围内,如果我们在 localhost 中。

  • 支持 ipv4 和 ipv6。
  • 支持 127.0.0.1 - 127.255.255.255 等 IP 范围

PHP代码:

function is_localhost() {

    $server_ip = null;

    if ( defined( 'INPUT_SERVER' ) && filter_has_var( INPUT_SERVER, 'REMOTE_ADDR' ) ) {
        $server_ip = filter_input( INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP );
    } elseif ( defined( 'INPUT_ENV' ) && filter_has_var( INPUT_ENV, 'REMOTE_ADDR' ) ) {
        $server_ip = filter_input( INPUT_ENV, 'REMOTE_ADDR', FILTER_VALIDATE_IP );
    } elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
        $server_ip = filter_var( $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP );
    }

    if ( empty( $server_ip ) ) {
        $server_ip = '127.0.0.1';
    }

    return empty( filter_var( $server_ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE ));
}
  1. 对于获取 ip,我使用它filter_input来避免用户在代码中注入 ip。
  2. 在某些情况下filter_input ,CGI 脚本不支持,所以如果不存在,我会以正常方式使用$_SERVERvar 获取 ip。
  3. FILTER_VALIDATE_IPFILTER_FLAG_NO_PRIV_RANGE记录在 php 站点中,您可以在此链接中找到更多信息。
于 2022-03-02T18:40:45.407 回答
-5

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

因为所有本地驱动器都有 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';
}
于 2017-03-03T21:19:12.890 回答