How can I detect if the user is on localhost in PHP?

前端 未结 9 1306
耶瑟儿~
耶瑟儿~ 2020-12-12 12:45

In other words, how can I tell if the person using my web application is on the server it resides on? If I remember correctly, PHPMyAdmin does something like this for securi

9条回答
  •  北海茫月
    2020-12-12 13:16

    If you want to have a whitelist / allowlist that supports static IPs and dynamic names.

    For example:

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

    This way you could set a list of names/IPs that will be able (for sure) to be detected. Dynamic names add more flexibility for accessing from different points.

    You have two common options here, you could set a name in your local hosts file or you could just use one dynamic name provider that could be found anywhere.

    This function CACHES results because gethostbyname is a very slow function.

    For this pupose I've implemented this function:

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

    For better reliability you could replace the $_SERVER['REMOTE_ADDR'] for the get_ip_address() that @Pekka mentioned in his post as "this bounty question"

提交回复
热议问题