[php] 사용자가 PHP의 localhost에 있는지 어떻게 알 수 있습니까?

즉, 내 웹 응용 프로그램을 사용하는 사람이 해당 응용 프로그램이있는 서버에 있는지 어떻게 알 수 있습니까? 내가 올바르게 기억하면 PHPMyAdmin은 보안상의 이유로 이와 같은 작업을 수행합니다.



답변

$_SERVER['REMOTE_ADDR']웹 서버에서 요청하는 클라이언트의 IP 주소를 사용할 수도 있습니다 .

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

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


답변

보완, 기능으로서 …

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


답변

새로운 OS 사용자 (Win 7, 8)는 화이트리스트 배열에 IPV6 형식 원격 주소를 포함해야 할 수도 있습니다.

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

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


답변

$_SERVER["REMOTE_ADDR"]사용자의 IP를 알려야합니다. 하지만 스푸핑이 가능합니다.

이 현상금 질문 에서 매우 자세한 토론을 확인하십시오 .

PHPMyAdmin으로 기억하는 것은 다른 것 같습니다. 많은 MySQL 서버는 보안상의 이유로 localhost에서만 액세스 할 수 있도록 구성되어 있습니다.


답변

미안하지만이 모든 대답은 나에게 끔찍한 것 같습니다. 어떤 의미에서 모든 기계가 “localhost”이기 때문에 질문을 바꾸는 것이 좋습니다.

문제는 다음과 같아야합니다. 실행되는 컴퓨터에 따라 다른 코드 경로를 어떻게 실행합니까?

제 생각에는 가장 쉬운 방법은 DEVMACHINE 또는 원하는 파일을 만든 다음 간단히 확인하는 것입니다.

file_exists ( ‘DEVMACHINE’)

라이브 호스팅 환경에 업로드 할 때이 파일을 제외해야합니다!

이 솔루션은 네트워크 구성에 의존하지 않고 스푸핑 될 수 없으며 실행중인 “라이브 코드”와 “개발 코드”간에 쉽게 전환 할 수 있습니다.


답변

이것은 $_SERVER['HTTP_HOST']쉽게 위조되는 http 헤더의 값이기 때문에 사용해서는 안되는 것 같습니다 .

당신도 사용할 수 있습니다 $_SERVER["REMOTE_ADDR"]. 이것은 더 안전한 값이지만 가짜도 가능합니다. 이것은 remote_addr아파치 반환에 결과 주소입니다.


답변

고정 IP동적 이름 을 지원 하는 화이트리스트 / 허용 목록 을 갖고 싶은 경우 .

예를 들면 :

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

이런 식으로 (확실히) 감지 할 수있는 이름 / IP 목록을 설정할 수 있습니다. 동적 이름은 다른 지점에서 액세스하는 데 더 많은 유연성을 추가합니다.

여기에는 두 가지 공통 옵션이 있습니다. 로컬 호스트 파일에 이름을 설정 하거나 어디에서나 찾을 수있는 하나의 동적 이름 공급자 를 사용할 수 있습니다.

이 함수는 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;
}

더 나은 안정성을 위해 @Pekka“이 현상금 질문” 으로 자신의 게시물 에서 언급 한 get_ip_address ()에 대한 $ _SERVER [ ‘REMOTE_ADDR’] 을 대체 할 수 있습니다.