IT

사용자가 PHP의 localhost에 어떻게 알 수 있습니까?

lottoking 2020. 9. 13. 10:57
반응형

사용자가 PHP의 localhost에 어떻게 알 수 있습니까?


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


$_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 서버는 보안상의 MIS localhost에서 액세스 할 수 있도록 구성되어 있습니다.


이것은 $_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']대체 할 수 있습니다.


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

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

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

file_exists ( 'DEVMACHINE')

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

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


$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']클라이언트가 서버와 동일한 시스템에 있는지 확인 하기 위해 비교 하는 것은 어떻습니까?


쉬운 답을 찾았습니다.

모든 로컬 드라이브에는 C : 또는 D : 또는 F : ... 등이 있기 때문입니다.

두 번째 문자가 다음과 같은지 감지하십시오.

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

참고 URL : https://stackoverflow.com/questions/2053245/how-can-i-detect-if-the-user-is-on-localhost-in-php

반응형