web-dev-qa-db-fra.com

Comment puis-je détecter si l'utilisateur est sur localhost en PHP?

En d'autres termes, comment savoir si la personne utilisant mon application Web se trouve sur le serveur sur lequel elle réside? Si je me souviens bien, PHPMyAdmin fait quelque chose comme ceci pour des raisons de sécurité.

86
Richie Marquez

Vous pouvez aussi utiliser $_SERVER['REMOTE_ADDR'] pour laquelle l'adresse IP du client demandeur est fournie par le serveur Web.

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

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

En complément, en fonction ...

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

Les utilisateurs de systèmes d'exploitation plus récents (Win 7 et 8) peuvent également juger nécessaire d'inclure une adresse distante au format IPV6 dans leur tableau de liste blanche:

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

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

$_SERVER["REMOTE_ADDR"] devrait vous indiquer l'adresse IP de l'utilisateur. C'est spoofable, cependant.

Vérifiez cette question de prime pour une discussion très détaillée.

Je pense que PHPMyAdmin a quelque chose de différent: beaucoup de serveurs MySQL sont configurés de manière à ne pouvoir être accessibles à partir de localhost que pour des raisons de sécurité.

14
Pekka 웃

Il ne semble pas que vous devriez utiliser $_SERVER['HTTP_Host'], car il s’agit de la valeur de l’en-tête http, facilement simulé.

Vous pouvez utiliser $_SERVER["REMOTE_ADDR"] _ c'est aussi la valeur la plus sûre, mais il est également possible de simuler. Cette remote_addr est l'adresse à laquelle Apache renvoie le résultat.

6
nicola

Je suis désolé mais toutes ces réponses me semblent terribles. Je suggérerais de reformuler la question parce que dans un sens, toutes les machines sont "locales".

La question devrait être; Comment exécuter différents chemins de code en fonction de la machine sur laquelle il est exécuté?.

À mon avis, le moyen le plus simple est de créer un fichier appelé DEVMACHINE ou ce que vous voulez vraiment, puis de vérifier

file_exists ('DEVMACHINE')

N'oubliez pas d'exclure ce fichier lors du téléchargement dans l'environnement d'hébergement en direct!

Cette solution ne dépend pas de la configuration du réseau, elle ne peut pas être usurpée et permet de basculer facilement entre "live-code" et "dev-code".

1
Daniklad

Si vous souhaitez avoir une liste blanche /allowlist prenant en charge des adresses IP statiques et noms dynamiques .

Par exemple:

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

De cette façon, vous pourriez définir une liste de noms/IP qui pourront (à coup sûr) être détectés. Les noms dynamiques ajoutent plus de flexibilité pour accéder à partir de différents points.

Vous avez deux options communes ici, vous pouvez définir un nom dans votre fichier d’hôte local ou simplement en utiliser une . fournisseur de nom dynamique pouvant être trouvé n’importe où.

Cette fonction CACHES a pour résultat parce que gethostbyname est une fonction très lente.

Pour ce but, j'ai implémenté cette fonction:

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

Pour une meilleure fiabilité, vous pouvez remplacer le $ _ SERVER ['REMOTE_ADDR'] par le get_ip_address () que @Pekka a mentionné dans son post comme "cette question de prime"

1
Heroselohim

Que diriez-vous de comparer $_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR'] pour déterminer si le client est sur la même machine que le serveur?

0
Eugen Wesseloh