Question

En d'autres termes, comment puis-je savoir si la personne qui utilise mon application Web est sur le serveur où il réside? Si je me souviens bien, PHPMyAdmin fait quelque chose comme cela pour des raisons de sécurité.

Était-ce utile?

La solution

Vous pouvez également utiliser $_SERVER['REMOTE_ADDR'] pour laquelle l'adresse IP du client demandeur est donnée par le serveur web.

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

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

Autres conseils

En complément, en fonction ...

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

Les utilisateurs d'OS plus récent (Windows 7, 8) peuvent également trouver nécessaire d'inclure un format IPV6 adresse dans leur tableau whitelist:

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

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

Si vous voulez avoir un whitelist / allowlist supports statiques IP et les 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 pouvez définir une liste de noms / adresses IP qui sera en mesure (pour sûr) à détecter. Les noms dynamiques ajoutent plus de flexibilité pour accéder à différents points.

Vous avez deux options communes ici, vous pouvez définir un nom dans votre fichier local hosts ou vous pouvez simplement utiliser un fournisseur de nom dynamique qui pourrait être trouvé nulle part.

Cette fonction met en cache les résultats car gethostbyname est une fonction très lente.

Pour réaliser cet objectif, je l'ai mis en œuvre 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é que vous pouvez remplacer le $ _ SERVER [ 'REMOTE_ADDR'] get_ip_address () @Pekka mentionné dans son post comme "cette question de primes"

Je suis désolé mais semble terrible moi toutes ces réponses. Je suggère de reformuler la question parce que dans un sens, toutes les machines sont « localhost ».

La question devrait être; Comment puis-je exécuter différents chemins de code selon la machine sur laquelle est exécutée sur.

À mon avis, la meilleure façon est de créer un fichier appelé DevMachine ou tout ce que vous voulez vraiment, puis consultez

  

file_exists ( 'DevMachine')

Rappelez-vous d'exclure ce fichier lors du téléchargement à l'environnement d'hébergement en direct!

Cette solution ne dépend pas de la configuration du réseau, il ne peut pas être falsifié et il est facile de basculer entre marche « live-code » et « dev-code ».

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?

J'ai trouvé une réponse facile.

Parce que tous les disques locaux ont C: ou D: ou F:. ... etc

Il suffit de détecter si le second caractère est:

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';
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top