복붙노트

PHP에서 클라이언트 IP 주소를 얻는 방법?

PHP

PHP에서 클라이언트 IP 주소를 얻는 방법?

PHP를 사용하여 클라이언트 IP 주소를 얻으려면 어떻게해야합니까?

내 웹 사이트에 로그인 한 사용자의 IP 주소를 기록하고 싶습니다.

해결법

  1. ==============================

    1.

    무엇을 하든지 클라이언트에서 보낸 데이터를 신뢰하지 않도록하십시오. $ _SERVER [ 'REMOTE_ADDR']은 연결 상대방의 실제 IP 주소를 포함합니다. 그것은 당신이 찾을 수있는 가장 신뢰할 수있는 가치입니다.

    그러나 프록시 서버 뒤에 있기 때문에 프록시에서 $ _SERVER [ 'HTTP_X_FORWARDED_FOR']을 (를) 설정했을 수 있지만이 값은 쉽게 스푸핑됩니다. 예를 들어, 프록시가없는 사람이 설정할 수도 있고 IP가 프록시 뒤의 LAN에서 내부 IP가 될 수도 있습니다.

    즉, $ _SERVER [ 'HTTP_X_FORWARDED_FOR']를 (를) 저장하려는 경우 $ _SERVER [ 'REMOTE_ADDR'] 값을 저장해야합니다. 예 : 데이터베이스의 다른 필드에 두 값을 저장하십시오.

    IP를 문자열로 데이터베이스에 저장하려면 적어도 45 자의 공간이 있어야합니다. IPv6은 여기 있어야하며 그 주소는 이전 IPv4 주소보다 큽니다.

    (IPv6는 대개 39자를 사용하지만 IPv4 주소는 최대 45 자까지 입력 할 수있는 특수한 IPv6 표기법이 있으므로 39자를 사용할 수 있습니다. 단지 그것을 설정하고 잊고 싶다면, 45 번을 사용하십시오).

  2. ==============================

    2.

    $ _SERVER [ 'REMOTE_ADDR']은 실제 클라이언트 IP 주소를 포함하지 않을 수도 있습니다. 예를 들어 프록시를 통해 연결된 클라이언트의 프록시 주소를 제공합니다. 그건 아마도 IP로 무엇을 하느냐에 따라 실제로 원하는 것을 선택하십시오. 누군가의 개인 RFC1918 주소는 트래픽이 어디서 발생했는지, 사용자가 마지막으로 연결 한 IP를 기억하는지, 프록시 또는 NAT 게이트웨이의 공개 IP가 더 많은지 저장하기에 적절합니다.

    X-Forwarded-For와 같은 여러 HTTP 헤더가 여러 프록시에 의해 설정 될 수도 있고 설정되지 않을 수도 있습니다. 문제는 그것들이 단지 누군가에 의해 설정 될 수있는 HTTP 헤더에 불과하다는 것이다. 콘텐츠에 대한 보증은 없습니다. $ _SERVER [ 'REMOTE_ADDR']은 웹 서버가 연결을 수신하고 응답을받을 실제 IP 주소입니다. 다른 것은 임의적이고 자발적인 정보입니다. 이 정보를 신뢰할 수있는 시나리오는 하나뿐입니다.이 헤더를 설정하는 프록시를 제어하고 있습니다. 의미가있는 경우에만 100 % 어디에서 어떻게 헤더를 설정했는지 아는 것이 중요합니다.

    여기에 몇 가지 샘플 코드가 있습니다.

    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    

    편집자 주 : 위의 코드를 사용하면 보안에 영향을 미칩니다. 클라이언트는 모든 HTTP 헤더 정보 (예 : $ _SERVER [ 'HTTP _...])를 원하는 임의의 값으로 설정할 수 있습니다. 따라서 $ _SERVER [ 'REMOTE_ADDR']은 사용자가 설정할 수 없으므로 훨씬 더 안정적입니다.

    올린 사람 : http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html

  3. ==============================

    3.

    echo $_SERVER['REMOTE_ADDR'];
    

    http://php.net/manual/en/reserved.variables.server.php

  4. ==============================

    4.

    다음은 사용자의 ip를 얻는 좋은 방법에 대한보다 명확한 코드 샘플입니다.

    $ip = $_SERVER['HTTP_CLIENT_IP']?$_SERVER['HTTP_CLIENT_IP']:($_SERVER['HTTP_X_FORWARDE‌​D_FOR']?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR']);
    

    다음은 elvis 연산자를 사용하는 짧은 버전입니다.

    $_SERVER['HTTP_CLIENT_IP']?:($_SERVER['HTTP_X_FORWARDE‌​D_FOR']?:$_SERVER['REMOTE_ADDR']);
    

    다음은 isset을 사용하여 통지를 제거하는 버전입니다 (감사합니다, @shasi kanth).

    $ip = isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
    
  5. ==============================

    5.

    $ _SERVER [ 'REMOTE_ADDR'] 변수에 포함되어야합니다.

  6. ==============================

    6.

    내가 가장 좋아하는 솔루션은 Zend Framework 2가 사용하는 방법이다. 또한 $ _SERVER 속성 HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP, REMOTE_ADDR을 고려하지만 일부 신뢰할 수있는 프록시를 설정하는 클래스를 선언하고 배열이 아닌 하나의 IP 주소를 반환합니다. 나는 이것이 이것에 가장 가까운 해결책이라고 생각한다.

    class RemoteAddress
    {
        /**
         * Whether to use proxy addresses or not.
         *
         * As default this setting is disabled - IP address is mostly needed to increase
         * security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
         * just for more flexibility, but if user uses proxy to connect to trusted services
         * it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
         *
         * @var bool
         */
        protected $useProxy = false;
    
        /**
         * List of trusted proxy IP addresses
         *
         * @var array
         */
        protected $trustedProxies = array();
    
        /**
         * HTTP header to introspect for proxies
         *
         * @var string
         */
        protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';
    
        // [...]
    
        /**
         * Returns client IP address.
         *
         * @return string IP address.
         */
        public function getIpAddress()
        {
            $ip = $this->getIpAddressFromProxy();
            if ($ip) {
                return $ip;
            }
    
            // direct IP address
            if (isset($_SERVER['REMOTE_ADDR'])) {
                return $_SERVER['REMOTE_ADDR'];
            }
    
            return '';
        }
    
        /**
         * Attempt to get the IP address for a proxied client
         *
         * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
         * @return false|string
         */
        protected function getIpAddressFromProxy()
        {
            if (!$this->useProxy
                || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
            ) {
                return false;
            }
    
            $header = $this->proxyHeader;
            if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
                return false;
            }
    
            // Extract IPs
            $ips = explode(',', $_SERVER[$header]);
            // trim, so we can compare against trusted proxies properly
            $ips = array_map('trim', $ips);
            // remove trusted proxy IPs
            $ips = array_diff($ips, $this->trustedProxies);
    
            // Any left?
            if (empty($ips)) {
                return false;
            }
    
            // Since we've removed any known, trusted proxy servers, the right-most
            // address represents the first IP we do not know about -- i.e., we do
            // not know if it is a proxy server, or a client. As such, we treat it
            // as the originating IP.
            // @see http://en.wikipedia.org/wiki/X-Forwarded-For
            $ip = array_pop($ips);
            return $ip;
        }
    
        // [...]
    }
    

    전체 코드는 다음을 참조하십시오. https : / / / / / / /

  7. ==============================

    7.

    인터넷 뒤에는 다양한 유형의 사용자가 있으므로 다른 포션에서 IP 주소를 알아 내야합니다. 그것은,

    1. $ _SERVER [ 'REMOTE_ADDR'] - 여기에는 클라이언트의 실제 IP 주소가 포함됩니다. 이것이 사용자로부터 찾을 수있는 가장 신뢰할 수있는 가치입니다.

    2. $ _ 서버 [ '원격 호스트]'- 사용자가 현재 페이지를보고있는 호스트 이름을 가져옵니다. 그러나이 스크립트가 작동하려면 httpd.conf 내에서 호스트 이름 조회가 구성되어야합니다.

    3. $ _ 서버 [ 'HTTP_CLIENT_IP'] - 사용자가 공유 인터넷 서비스를 사용할 때 IP 주소를 가져옵니다.

    4. $ _SERVER [ 'HTTP_X_FORWARDED_FOR'] - 사용자가 프록시를 사용하고있을 때 IP 주소를 가져옵니다.

    그래서 우리는 다음과 같은 결합 된 기능을 사용하여 다른 위치에서 보는 사용자로부터 실제 IP 주소를 가져올 수 있습니다.

    // Function to get the user IP address
    function getUserIP() {
        $ipaddress = '';
        if (isset($_SERVER['HTTP_CLIENT_IP']))
            $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
        else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
            $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
        else if(isset($_SERVER['HTTP_X_FORWARDED']))
            $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
        else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
            $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
        else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
            $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
        else if(isset($_SERVER['HTTP_FORWARDED']))
            $ipaddress = $_SERVER['HTTP_FORWARDED'];
        else if(isset($_SERVER['REMOTE_ADDR']))
            $ipaddress = $_SERVER['REMOTE_ADDR'];
        else
            $ipaddress = 'UNKNOWN';
        return $ipaddress;
    }
    
  8. ==============================

    8.

    이것은 내가 찾은 가장 진보 된 방법이며, 과거에는 이미 다른 방법을 시도해 보았습니다. 방문자의 IP 주소를 확보하기 위해 유효합니다 (단, 해커가 쉽게 IP 주소를 위조 할 수 있음에 유의하십시오).

    function get_ip_address() {
        // check for shared internet/ISP IP
        if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
            return $_SERVER['HTTP_CLIENT_IP'];
        }
    
        // check for IPs passing through proxies
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            // check if multiple ips exist in var
            if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
                $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
                foreach ($iplist as $ip) {
                    if (validate_ip($ip))
                        return $ip;
                }
            } else {
                if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
                    return $_SERVER['HTTP_X_FORWARDED_FOR'];
            }
        }
        if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
            return $_SERVER['HTTP_X_FORWARDED'];
        if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
            return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
        if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
            return $_SERVER['HTTP_FORWARDED_FOR'];
        if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
            return $_SERVER['HTTP_FORWARDED'];
    
        // return unreliable ip since all else failed
        return $_SERVER['REMOTE_ADDR'];
    }
    
    /**
     * Ensures an ip address is both a valid IP and does not fall within
     * a private network range.
     */
    function validate_ip($ip) {
        if (strtolower($ip) === 'unknown')
            return false;
    
        // generate ipv4 network address
        $ip = ip2long($ip);
    
        // if the ip is set and not equivalent to 255.255.255.255
        if ($ip !== false && $ip !== -1) {
            // make sure to get unsigned long representation of ip
            // due to discrepancies between 32 and 64 bit OSes and
            // signed numbers (ints default to signed in PHP)
            $ip = sprintf('%u', $ip);
            // do private network range checking
            if ($ip >= 0 && $ip <= 50331647) return false;
            if ($ip >= 167772160 && $ip <= 184549375) return false;
            if ($ip >= 2130706432 && $ip <= 2147483647) return false;
            if ($ip >= 2851995648 && $ip <= 2852061183) return false;
            if ($ip >= 2886729728 && $ip <= 2887778303) return false;
            if ($ip >= 3221225984 && $ip <= 3221226239) return false;
            if ($ip >= 3232235520 && $ip <= 3232301055) return false;
            if ($ip >= 4294967040) return false;
        }
        return true;
    }
    

    출처 : http://blackbe.lt/advanced-method-to-obtain-the-client-ip-in-php/

  9. ==============================

    9.

    대답은 $ _SERVER 변수를 사용하는 것입니다. 예를 들어 $ _SERVER [ "REMOTE_ADDR"]는 클라이언트의 IP 주소를 반환합니다.

  10. ==============================

    10.

    이것은 내가 사용하는 방법이며 IPv4 입력의 유효성을 검사합니다.

    // Get user IP address
    if ( isset($_SERVER['HTTP_CLIENT_IP']) && ! empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';
    }
    
    $ip = filter_var($ip, FILTER_VALIDATE_IP);
    $ip = ($ip === false) ? '0.0.0.0' : $ip;
    
  11. ==============================

    11.

    $ip = "";
    
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
    {
     //check for ip from share internet
     $ip = $_SERVER["HTTP_CLIENT_IP"];
    }
    elseif (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    {
     // Check for the Proxy User
     $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }
    else
    {
     $ip = $_SERVER["REMOTE_ADDR"];
    }
    echo $ip;
    
  12. ==============================

    12.

    나는이 코드 닛을 좋아한다 :

    function getClientIP() {
    
        if (isset($_SERVER)) {
    
            if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
                return $_SERVER["HTTP_X_FORWARDED_FOR"];
    
            if (isset($_SERVER["HTTP_CLIENT_IP"]))
                return $_SERVER["HTTP_CLIENT_IP"];
    
            return $_SERVER["REMOTE_ADDR"];
        }
    
        if (getenv('HTTP_X_FORWARDED_FOR'))
            return getenv('HTTP_X_FORWARDED_FOR');
    
        if (getenv('HTTP_CLIENT_IP'))
            return getenv('HTTP_CLIENT_IP');
    
        return getenv('REMOTE_ADDR');
    }
    
  13. ==============================

    13.

     $_SERVER['REMOTE_ADDR'];
    

    이거 한번 해봐

  14. ==============================

    14.

    음, 이것은 $ _SERVER라는 GLOBAL 변수를 사용하여 간단히 수행 할 수 있습니다.

    $ _SERVER는 속성 이름이 REMOTE_ADDR 인 배열입니다.

    그냥 다음과 같이 지정하십시오. $ userIp = $ _SERVER [ 'REMOTE_ADDR'];

    echo $ _SERVER [ 'REMOTE_ADDR']와 같이 직접 사용하십시오; 또는 echo ($ _SERVER [ 'REMOTE_ADDR']);

  15. ==============================

    15.

    다른 모든 사람들은 $ _SERVER [ 'REMOTE_ADDR']; 클라이언트 IP 주소를 얻으려면.

    또한 사용자에 대한 추가 정보가 필요하면 다음을 사용할 수 있습니다.

    <?php
        $ip='0.0.0.0';
        $ip=$_SERVER['REMOTE_ADDR'];
        $clientDetails = json_decode(file_get_contents("http://ipinfo.io/$ip/json"));
        echo "You're logged in from: <b>" . $clientDetails->country . "</b>";
    ?>
    

    클라이언트의 더 자세한 정보는 $ clientDetails에 있습니다. 다음과 같이 $ clientDetails 변수에 저장된 json 항목을 가져올 수 있습니다 : $ clientDetails-> PostalCode / hostname / region / loc ...

    추가 정보를 얻기 위해 ipinfo.io를 사용하고 있습니다.

    나는 그것이 도움이되기를 바랍니다.

  16. ==============================

    16.

    다음 함수는 모든 가능성을 결정하고 쉼표로 구분 된 값 (ip, ip 등)을 반환합니다.

    또한 (기본적으로 사용하지 않도록 설정된 첫 번째 매개 변수 인) 선택적 유효성 검사 기능을 통해 (개인 범위 및 예약 된 범위)에 대해 IP 주소의 유효성을 검사합니다.

    <?php
    echo GetClientIP(true);
    
    function GetClientIP($validate = False){
      $ipkeys = array(
      'REMOTE_ADDR', 
      'HTTP_CLIENT_IP', 
      'HTTP_X_FORWARDED_FOR', 
      'HTTP_X_FORWARDED', 
      'HTTP_FORWARDED_FOR', 
      'HTTP_FORWARDED', 
      'HTTP_X_CLUSTER_CLIENT_IP'
      );
    
      /*
      now we check each key against $_SERVER if contain such value
      */
      $ip = array();
      foreach($ipkeys as $keyword){
        if( isset($_SERVER[$keyword]) ){
          if($validate){
            if( ValidatePublicIP($_SERVER[$keyword]) ){
              $ip[] = $_SERVER[$keyword];
            }
          }else{
            $ip[] = $_SERVER[$keyword];
          }
        }
      }
    
      $ip = ( empty($ip) ? 'Unknown' : implode(", ", $ip) );
      return $ip;
    
    }
    function ValidatePublicIP($ip){
      if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
        return true;
      }
      else {
        return false;
      }
    } 
    
  17. ==============================

    17.

    이 기능은 소형으로 어디에서나 사용할 수 있습니다. 하지만!

    이걸 잊지 마! 이 유형의 기능 또는 코드 블록은 일부 사용자가 프록시 또는 다른 보안 게이트웨이를 사용하여 보이지 않거나 추적 할 수 없기 때문에 User Real IP를 기록 할 수 없습니다

    PHP 기능 :

    function GetIP()
    {
        if ( getenv("HTTP_CLIENT_IP") ) {
            $ip = getenv("HTTP_CLIENT_IP");
        } elseif ( getenv("HTTP_X_FORWARDED_FOR") ) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
            if ( strstr($ip, ',') ) {
                $tmp = explode(',', $ip);
                $ip = trim($tmp[0]);
            }
        } else {
            $ip = getenv("REMOTE_ADDR");
        }
        return $ip;
    }
    

    사용법 :

    $ IP = GetIP (); 또는 직접 GetIP ();

  18. ==============================

    18.

    function get_client_ip() 
    {
       $ipaddress = '';
        if (getenv('HTTP_CLIENT_IP'))
            $ipaddress = getenv('HTTP_CLIENT_IP');
        else if(getenv('HTTP_X_FORWARDED_FOR'))
            $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
        else if(getenv('HTTP_X_FORWARDED'))
            $ipaddress = getenv('HTTP_X_FORWARDED');
        else if(getenv('HTTP_FORWARDED_FOR'))
            $ipaddress = getenv('HTTP_FORWARDED_FOR');
        else if(getenv('HTTP_FORWARDED'))
           $ipaddress = getenv('HTTP_FORWARDED');
        else if(getenv('REMOTE_ADDR'))
            $ipaddress = getenv('REMOTE_ADDR');
        else
            $ipaddress = 'UNKNOWN';
    
       return $ipaddress;
    } 
    
  19. ==============================

    19.

    그게 좋아?

    if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',validate_ip))===false or empty($ip)){
      exit;
      }
    echo $ip;
    

    추신

    if(($ip=filter_input(INPUT_SERVER,'REMOTE_ADDR',FILTER_VALIDATE_IP|FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE))===false){
      header('HTTP/1.0 400 Bad Request');
      exit;
    }
    

    'HTTP_'또는 'X-'로 시작하는 모든 머리글은 스푸핑 일 수 있으며 사용자 정의입니다. 당신이 사용 cooies 등을 추적하고 싶다면

  20. ==============================

    20.

    간단한 라이너가 있습니다.

    $ip = $_SERVER['HTTP_X_FORWARDED_FOR']?: $_SERVER['HTTP_CLIENT_IP']?: $_SERVER['REMOTE_ADDR'];
    

    편집하다:

    위 코드는 예약 된 주소 (예 : 10.0.0.1), 진행중인 모든 프록시 서버의 주소 목록 등을 반환 할 수 있습니다. 이러한 경우를 처리하려면 다음 코드를 사용하십시오.

    function valid_ip($ip) {
        // for list of reserved IP addresses, see https://en.wikipedia.org/wiki/Reserved_IP_addresses
        return $ip && substr($ip, 0, 4) != '127.' && substr($ip, 0, 4) != '127.' && substr($ip, 0, 3) != '10.' && substr($ip, 0, 2) != '0.' ? $ip : false;
    }
    
    function get_client_ip() {
        // using explode to get only client ip from list of forwarders. see https://en.wikipedia.org/wiki/X-Forwarded-For
        return
        @$_SERVER['HTTP_X_FORWARDED_FOR'] ? explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'], 2)[0] :
        @$_SERVER['HTTP_CLIENT_IP'] ? explode(',', $_SERVER['HTTP_CLIENT_IP'], 2)[0] :
        valid_ip(@$_SERVER['REMOTE_ADDR']) ?:
        'UNKNOWN';
    }
    
    echo get_client_ip();
    
  21. ==============================

    21.

    $_SERVER['REMOTE_ADDR'];
    

    예:

    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    
  22. ==============================

    22.

    클라이언트의 IP 주소를 얻는 한 줄짜리 버전은 다음과 같습니다.

    노트:

  23. from https://stackoverflow.com/questions/3003145/how-to-get-the-client-ip-address-in-php by cc-by-sa and MIT lisence