Jak mogę wykryć, czy użytkownik jest na localhost w PHP?

Innymi słowy, jak mogę stwierdzić, czy osoba korzystająca z mojej aplikacji internetowej znajduje się na serwerze, na którym się znajduje? Jeśli dobrze pamiętam, PHPMyAdmin robi coś takiego ze względów bezpieczeństwa.

Author: Richie Marquez, 2010-01-13

8 answers

Można również użyć $_SERVER['REMOTE_ADDR'], dla którego adres IP żądanego klienta jest podany przez serwer WWW.

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
 132
Author: mauris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 02:19:21

Jako dopełniacz, jako funkcja...

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
 17
Author: Jens Törnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 14:25:50

$_SERVER["REMOTE_ADDR"] powinien podać IP użytkownika. Ale jest fałszywa.

Sprawdź to pytanie o nagrodę do bardzo szczegółowej dyskusji.

Myślę, że to, co pamiętasz z PHPMyAdmin, jest czymś innym: wiele serwerów MySQL jest skonfigurowanych tak, że mogą być dostępne tylko z localhost ze względów bezpieczeństwa.

 14
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:13

Nowsi użytkownicy systemu operacyjnego (Win 7, 8) mogą również uznać za konieczne dołączenie ZDALNEGO ADRESU w formacie IPV6 do tablicy białej:

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

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
 13
Author: reekogi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-25 18:06:00

Wydaje się, że nie powinieneś używać $_SERVER['HTTP_HOST'], ponieważ jest to wartość w nagłówku http, łatwo sfałszowana.

Możesz również użyć $_SERVER["REMOTE_ADDR"], jest to bardziej bezpieczna wartość, ale możliwe jest również fałszowanie. This remote_addr is the address where Apache returns result to.

 6
Author: nicola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-18 11:31:52

Jeśli chcesz mieć whitelist / allowlist , który obsługuje statyczne adresy IP i dynamiczne nazwy .

Na przykład:

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

W ten sposób można ustawić listę nazw/IPs , które będą w stanie (na pewno) zostać wykryte. Nazwy dynamiczne zwiększają elastyczność dostępu z różnych punktów.

Masz dwie popularne opcje, możesz ustawić nazwę w swoim pliku local hosts lub po prostu użyć jednego dynamic name provider to można znaleźć wszędzie.

Ta funkcja buforuje wyniki, ponieważ gethostbyname jest funkcją bardzo powolną.

Dla tego pupose zaimplementowałem tę funkcję:

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

Dla lepszej niezawodności możesz zastąpić $_SERVER ['REMOTE_ADDR'] dla get_ip_address () że @ Pekka wspomniał w swoim poście jako "to pytanie"

 0
Author: Heroselohim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:13

Znalazłem łatwą odpowiedź.

Ponieważ wszystkie dyski lokalne mają C: lub D: lub F:... itd.

Po prostu Wykryj, czy drugi znak to a:

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';
}
 0
Author: Scoobeedo Cool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 21:19:12

Może porównamy $_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR'], aby ustalić, czy klient jest na tej samej maszynie co serwer?

 0
Author: Eugen Wesseloh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 12:05:35