PHPINFO

PHP - 실제 클라이언트 IP주소 가져오기 본문

PHP

PHP - 실제 클라이언트 IP주소 가져오기

2017. 10. 24. 23:44

PHP개발을 하다보면, 부정사용을 방지하는 목적 등을 위해 사용자의 IP를 체크하는 경우가 있다. 

보통 아래와 같이 사용하게 된다.

<?php

$ip = $_SERVER['REMOTE_ADDR'];


하지만 경우에 따라서는 사용자의 IP주소를 올바르게 가져오지 못하는 경우가 있는데요, 예를 들면 사용자가 프록시 서버를 경유해 특정 웹사이트로 접근하면 프록시 서버에 의해 사용자의 실제 IP주소를 숨길 수 있기 때문입니다.


그런데 이러한 경우에도, 다른 방법을 통해 실제 사용자의 IP주소를 알아낼 수 있습니다.

웹사이트에 접근할 때, 여러 가지 헤더정보를 넘겨 주게 되는데, 거기에 원래(실제) 사용자의 IP주소도 같이 넘겨 받게 됩니다. 그 메소드가 "X-Forwarded-For"이고, PHP에서는 "HTTP_X_FORWARDED_FOR" 변수에 저장됩니다.


그러므로 HTTP_X_FORWARDED_FOR 변수로 비교 체크하여 불량IP주소를 어느정도 걸러낼 수 있습니다.


PHP 환경변수값을 불러오는 getenv() 를 이용하는 방법

function getRealClientIp() {

    $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 = '알수없음';

    } 

    return $ipaddress;

}



웹서버(아파치, nginx 등)를 통해 생성된 값들을 가지고 있는 $_SERVER 배열 변수를 이용하는 방법

function getRealClientIp() {

    $ipaddress = '';

    if ($_SERVER['HTTP_CLIENT_IP']) {

        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];

    } else if($_SERVER['HTTP_X_FORWARDED_FOR']) {

        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];

    } else if($_SERVER['HTTP_X_FORWARDED']) {

        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];

    } else if($_SERVER['HTTP_FORWARDED_FOR']) {

        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];

    } else if($_SERVER['HTTP_FORWARDED']) {

        $ipaddress = $_SERVER['HTTP_FORWARDED'];

    } else if($_SERVER['REMOTE_ADDR']) {

        $ipaddress = $_SERVER['REMOTE_ADDR'];

    } else {

        $ipaddress = '알수없음';

    }  

    return $ipaddress;

}


참고 : HTTP_X_FORWARDED_FOR 는 때로는 내부IP주소 또는 로컬IP주소를 표시하는 경우가 있고, 여러 IP주소일 경우에는 콤마(,)로 구분되어 표시됩니다.

0 Comments
댓글쓰기 폼
Prev 1 2 3 4 5 6 7 8 9 Next