Как я могу определить, находится ли пользователь на локальном хосте в PHP? - PullRequest
85 голосов
/ 13 января 2010

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

Ответы [ 9 ]

150 голосов
/ 13 января 2010

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

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
19 голосов
/ 11 февраля 2014

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

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
14 голосов
/ 25 сентября 2013

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

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
14 голосов
/ 13 января 2010

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

Проверьте этот вопрос щедрости для очень подробного обсуждения.

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

6 голосов
/ 26 апреля 2011

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

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

1 голос
/ 26 апреля 2019

Извините, но все эти ответы кажутся мне ужасными. Я бы предложил перефразировать вопрос, потому что в некотором смысле все машины являются "localhost".

Вопрос должен быть; Как запустить разные пути кода в зависимости от того, на каком компьютере он выполняется.

На мой взгляд, самый простой способ - создать файл с именем DEVMACHINE или что угодно, а затем просто проверить

file_exists ( 'DevMachine')

Не забудьте исключить этот файл при загрузке в среду реального хостинга!

Это решение не зависит от конфигурации сети, оно не может быть подделано и позволяет легко переключаться между «live-code» и «dev-code».

1 голос
/ 03 октября 2014

Если вы хотите иметь белый / разрешительный список , который поддерживает статические IP-адреса и динамические имена .

Например:

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

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

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

Эта функция возвращает 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'] на get_ip_address () , который @Pekka упомянул в своем сообщении как "этот вопрос щедрости"

0 голосов
/ 05 мая 2017

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

0 голосов
/ 04 марта 2017

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

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