programing

사용자가 PHP의 localhost에 있는지 어떻게 검출할 수 있습니까?

shortcode 2022. 10. 25. 20:15
반응형

사용자가 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 사용자(Windows 7, 8)는 화이트리스트 배열에 IPV6 형식의 리모트주소를 포함할 필요가 있는 경우도 있습니다.

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

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

미안하지만 이 모든 답변들이 제게는 끔찍하게 느껴집니다.어떤 의미에서는 모든 머신이 "localhost"이기 때문에 질문을 바꿔 말하는 것이 좋습니다.

문제는 실행되는 머신에 따라 다른 코드 경로를 실행하는 방법입니다.

내 생각에 가장 쉬운 방법은 DEVMACHINE 또는 당신이 정말 원하는 파일을 만든 후 간단히 확인하는 것이다.

file_exists('DEVMACHINE')

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

이 솔루션은 네트워크 구성에 의존하지 않기 때문에 스푸핑할 수 없으며 "live-code"와 "dev-code"를 쉽게 전환할 수 있습니다.

$_SERVER["REMOTE_ADDR"]IP 주소이치노

자세한 내용은 이 포상금 질문을 확인하십시오.

PHPMyAdmin을 사용하여 기억하는 것은 뭔가 다르다고 생각합니다.많은 MySQL Server는 보안상의 이유로 localhost에서만 액세스할 수 있도록 구성되어 있습니다.

하면 안것 요.$_SERVER['HTTP_HOST']「http http」는 「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']를 대체할 수 있습니다.

비교는 어떻습니까?$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']클라이언트가 서버와 같은 머신 상에 있는지 여부를 판별할 수 있습니까?

이 간단한 PHP 조건 사용

if($_SERVER['HTTP_HOST'] == 'localhost')
{
    die('Localhost');
}

또한 localhost인지 아닌지를 쉽게 확인할 수 있는 다른 방법이 있습니다.이 코드는 ip가 private 또는 reserved 범위 내에 있는지 여부를 확인합니다(localhost에 있는 경우).

  • ipv4 및 ipv6를 지원합니다.
  • 127.0.0.1~127.255.255.255와 같은 IP 범위를 지원합니다.

PHP 코드:

function is_localhost() {

    $server_ip = null;

    if ( defined( 'INPUT_SERVER' ) && filter_has_var( INPUT_SERVER, 'REMOTE_ADDR' ) ) {
        $server_ip = filter_input( INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP );
    } elseif ( defined( 'INPUT_ENV' ) && filter_has_var( INPUT_ENV, 'REMOTE_ADDR' ) ) {
        $server_ip = filter_input( INPUT_ENV, 'REMOTE_ADDR', FILTER_VALIDATE_IP );
    } elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
        $server_ip = filter_var( $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP );
    }

    if ( empty( $server_ip ) ) {
        $server_ip = '127.0.0.1';
    }

    return empty( filter_var( $server_ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE ));
}
  1. get ip 사용filter_input사용자에 의한 코드의 ip 주입을 회피합니다.
  2. 어떤 경우에는filter_inputCGI 스크립트는 지원되지 않으므로 존재하지 않는 경우 정상적으로 IP를 가져옵니다.$_SERVER변화.
  3. FILTER_VALIDATE_IP그리고.FILTER_FLAG_NO_PRIV_RANGE자세한 내용은 php 사이트에 기재되어 있습니다.

나는 쉬운 답을 찾았다.

모든 로컬 드라이브에는 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

반응형