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 | 31 |
Tags
- 터미널
- phpinfo
- require_once
- 재귀약자
- nvm
- include_once
- trim
- str_replace
- 문자열
- 몫과나머지
- implode
- 배열
- ipaddress
- RTRIM
- array_map
- LTRIM
- explode
- proxy
- WSL2
- include
- array
- hyper
- node.js
- npm
- 함수
- 프록시
- require
- recursive acronym
- 개발환경
- php
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