Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- array
- include_once
- php
- 문자열
- array_map
- 터미널
- 배열
- require_once
- 재귀약자
- explode
- require
- 프록시
- ipaddress
- recursive acronym
- proxy
- node.js
- include
- WSL2
- npm
- 개발환경
- trim
- 몫과나머지
- RTRIM
- LTRIM
- phpinfo
- 함수
- implode
- hyper
- str_replace
- nvm
Archives
- Today
- Total
PHPINFO
PHP - 실제 클라이언트 IP주소 가져오기 본문
반응형
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() 를 이용하는 방법
<?php
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 배열 변수를 이용하는 방법
<?php
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주소일 경우에는 콤마(,)로 구분되어 표시됩니다.
Comments