Как я могу определить, если пользователь находится на localhost в PHP?


другими словами, как я могу сказать, если человек, использующий мое веб-приложение, находится на сервере, на котором он находится? Если я правильно помню, PHPMyAdmin делает что-то подобное по соображениям безопасности.

8 75

8 ответов:

вы также можете использовать $_SERVER['REMOTE_ADDR'] для которого IP-адрес запроса клиента задается веб-сервером.

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

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

как дополнение, как функция...

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

$_SERVER["REMOTE_ADDR"] должен сказать вам IP пользователя. Хотя это поддельно.

Регистрация этот вопрос щедрот для более подробного обсуждения.

Я думаю, что вы помните с PHPMyAdmin что-то другое: многие серверы MySQL настроены так, что они могут быть доступны только из localhost по соображениям безопасности.

новые пользователи ОС (Win 7, 8) также могут найти необходимым включить удаленный адрес формата IPV6 в свой массив белого списка:

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

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

не похоже, что вы должны использовать $_SERVER['HTTP_HOST'], потому что это значение в заголовке HTTP, легко подделать.

вы можете использовать $_SERVER["REMOTE_ADDR"] тоже это более безопасное значение, но его также можно подделать. Это remote_addr - это адрес, куда Apache возвращает результат.

Если вы хотите белый / allowlist, обслуживающей статические IPs и динамические имена.

например:

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

таким образом, вы можете установить список имена / IPs это будет возможно (наверняка) обнаружить. Динамические имена добавляют больше гибкости для доступа из разных точек.

у вас есть два варианта здесь, вы можете задать имя local hosts file или вы могли бы просто использовать один динамическое имя поставщика Это можно найти где угодно.

эта функция кэширует результаты, потому что gethostbyname является очень медленной функцией.

для этого pupose я реализовал эту функцию:

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'] на get_ip_address () что @Пекка упомянул в своем post как "эту награду вопрос"

Я нашел простой ответ.

потому что все локальные диски имеют 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';
}

Как насчет сравнения $_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR'] чтобы определить, находится ли клиент на той же машине, что и сервер?