티스토리 뷰
클라우드 플레어를 사용중인 호스트에서는 클라이언트의 ip주소를 알수없나?
클라우드 플레어를 통해서 접속하면 현재 사용하는 컴퓨터가 3.3.3.3이지만 호스트쪽에서 ip를 출력해보면
클라우드플레어의 ip로 나옵니다.
클라우드 플레어와 같은 CDN 서비스를 사용하는 경우, 클라이언트의 IP 주소를 직접 얻는 것은 어려울 수 있습니다. 이는 클라우드 플레어와 같은 CDN이 클라이언트와 웹 서버 사이에 위치하여 클라이언트의 IP 주소를 가리키는 요청 헤더를 변경할 수 있기 때문입니다. 대신, 일반적으로 클라우드 플레어나 다른 CDN 서비스는 클라이언트의 실제 IP 주소를 전달하기 위해 특별한 헤더를 제공합니다. 가장 일반적으로 사용되는 헤더는 `X-Forwarded-For`입니다. 이 헤더에는 클라이언트의 원래 IP 주소가 포함되어 있을 수 있습니다. 그러나 이러한 헤더를 신뢰할 수 없는 경우도 있으므로 이러한 정보를 사용할 때는 주의해야 합니다. 따라서 클라우드 플레어를 사용하는 호스트에서 클라이언트의 IP 주소를 얻으려면 해당 CDN 서비스가 제공하는 특정 방법을 사용해야 합니다. 일반적으로 CDN 서비스 제공 업체의 문서를 확인하여 이러한 정보를 얻을 수 있습니다.
PHP에서는 $_SERVER 슈퍼글로벌 변수를 통해 HTTP 요청 헤더를 가져올 수 있습니다. HTTP_X_FORWARDED_FOR 헤더를 얻으려면 이 변수를 사용하면 됩니다. 다음은 PHP에서 HTTP_X_FORWARDED_FOR 헤더를 출력하는 예시 코드입니다.
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR'];
echo "X-Forwarded-For: $x_forwarded_for";
} else {
echo "X-Forwarded-For 헤더가 없습니다.";
}
?>
서버에서 출력시켜보면 현재 접속하는 컴퓨터의 ip 주소가 나옵니다.
즉 cdn 통과로 내 사이트에서는 클라우드플레어 ip이지만 HTTP_X_FORWARDED_FOR를 찾을 수 있단 뜻입니다.
그럼 그누보드에서 실제 ip를 적기 위해서 클라우드플레어 ip가 아닌 HTTP_X_FORWARDED_FOR의 값으로 방문자에 저장하는
방법을 하겠습니다.
/config.php 에 보면
// 방문자수의 접속을 남김
include_once(G5_BBS_PATH.'/visit_insert.inc.php');
/bbs/visit_insert.inc.php
HTTP_X_FORWARDED_FOR
$sql = " insert {$g5['visit_table']} ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent, vi_browser, vi_os, vi_device ) values ( '{$vi_id}', '{$remote_addr}', '".G5_TIME_YMD."', '".G5_TIME_HIS."', '{$referer}', '{$user_agent}', '{$vi_browser}', '{$vi_os}', '{$vi_device}' ) ";
database 에서
g5_visit 테이블에 HTTP_X_FORWARDED_FOR 를 추가해줍니다.
// $_SERVER 배열변수 값의 변조를 이용한 SQL Injection 공격을 막는 코드입니다. 110810
$remote_addr = escape_trim($_SERVER['REMOTE_ADDR']);
$xf = escape_trim($_SERVER['HTTP_X_FORWARDED_FOR']);
$referer = "";
if (isset($_SERVER['HTTP_REFERER']))
$referer = escape_trim(clean_xss_tags($_SERVER['HTTP_REFERER']));
$user_agent = escape_trim(clean_xss_tags($_SERVER['HTTP_USER_AGENT']));
$vi_browser = '';
$vi_os = '';
$vi_device = '';
if(version_compare(phpversion(), '5.3.0', '>=') && defined('G5_BROWSCAP_USE') && G5_BROWSCAP_USE) {
include_once(G5_BBS_PATH.'/visit_browscap.inc.php');
}
$sql = " insert {$g5['visit_table']} ( vi_id, vi_ip, HTTP_X_FORWARDED_FOR, vi_date, vi_time, vi_referer, vi_agent, vi_browser, vi_os, vi_device ) values ( '{$vi_id}', '{$remote_addr}', '{$xf}', '".G5_TIME_YMD."', '".G5_TIME_HIS."', '{$referer}', '{$user_agent}', '{$vi_browser}', '{$vi_os}', '{$vi_device}' ) ";
// $_SERVER 배열변수 값의 변조를 이용한 SQL Injection 공격을 막는 코드입니다. 110810
$remote_addr = escape_trim($_SERVER['REMOTE_ADDR']);
$xf = escape_trim($_SERVER['HTTP_X_FORWARDED_FOR']);
$referer = "";
if (isset($_SERVER['HTTP_REFERER']))
$referer = escape_trim(clean_xss_tags($_SERVER['HTTP_REFERER']));
$user_agent = escape_trim(clean_xss_tags($_SERVER['HTTP_USER_AGENT']));
$vi_browser = '';
$vi_os = '';
$vi_device = '';
if(version_compare(phpversion(), '5.3.0', '>=') && defined('G5_BROWSCAP_USE') && G5_BROWSCAP_USE) {
include_once(G5_BBS_PATH.'/visit_browscap.inc.php');
}
$sql = " insert {$g5['visit_table']} ( vi_id, vi_ip, HTTP_X_FORWARDED_FOR, vi_date, vi_time, vi_referer, vi_agent, vi_browser, vi_os, vi_device ) values ( '{$vi_id}', '{$remote_addr}', '{$xf} ', '".G5_TIME_YMD."', '".G5_TIME_HIS."', '{$referer}', '{$user_agent}', '{$vi_browser}', '{$vi_os}', '{$vi_device}' ) ";
수집되는 위치를 만들어줬으면 관리자 화면에서 볼수있게 admin쪽 화면을 수정해줍니다
/adm/visit_search.php 에서
<option value="vi_ip"<?php echo get_selected($sfl, 'vi_ip'); ?>>IP</option>
<option value="HTTP_X_FORWARDED_FOR"<?php echo get_selected($sfl, 'HTTP_X_FORWARDED_FOR'); ?>>HTTP_X_FORWARDED_FOR</option>
................................
<th scope="col">IP</th>
<th scope="col">HTTP_X_FORWARDED_FOR</th>
................................
if ($is_admin == 'super') {
$ip = $row['vi_ip'];
$xp = $row['HTTP_X_FORWARDED_FOR'];
} else {
$ip = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY, $row['vi_ip']);
$xp = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY,$row['HTTP_X_FORWARDED_FOR']);
}
................................
<td class="td_id"><a href="<?php echo $_SERVER['SCRIPT_NAME']; ?>?sfl=vi_ip&stx=<?php echo $ip; ?>"><?php echo $ip; ?></a></td>
<td class="td_xid"><a href="<?php echo $_SERVER['SCRIPT_NAME']; ?>?sfl=HTTP_X_FORWARDED_FOR&stx=<?php echo $xp; ?>"><?php echo $xp; ?></a></td>
<option value="vi_ip"<?php echo get_selected($sfl, 'vi_ip'); ?>>IP</option>
<option value="HTTP_X_FORWARDED_FOR"<?php echo get_selected($sfl, 'HTTP_X_FORWARDED_FOR'); ?>>HTTP_X_FORWARDED_FOR</option>
................................
<th scope="col">IP</th>
<th scope="col">HTTP_X_FORWARDED_FOR</th>
................................
if ($is_admin == 'super') {
$ip = $row['vi_ip'];
$xp = $row['HTTP_X_FORWARDED_FOR'];
} else {
$ip = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY, $row['vi_ip']);
$xp = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY,$row['HTTP_X_FORWARDED_FOR']);
}
................................
<td class="td_id"><a href="<?php echo $_SERVER['SCRIPT_NAME']; ?>?sfl=vi_ip&stx=<?php echo $ip; ?>"><?php echo $ip; ?></a></td>
<td class="td_xid"><a href="<?php echo $_SERVER['SCRIPT_NAME']; ?>?sfl=HTTP_X_FORWARDED_FOR&stx=<?php echo $xp; ?>"><?php echo $xp; ?></a></td>
ip와 관련된 부분아래에 한줄씩 더 넣어줍니다.
이제 잘 나옵니다. ip 말고 cdn을 통해온 ip를 확인 할 수 잇게 되었습니다.
'웹 > 그누보드' 카테고리의 다른 글
영카트. 특정상품의 옵션으로 카테고리 상품 전체 옵션 변환하기 (3) | 2024.11.05 |
---|---|
그누보드 sns 공유버튼 눌러서 보낼때 주소가 잘리는 현상이 생기는 분들은 참고하세요 게시물 공유할때 게시판으로 가게 되는 경우 입니다. (0) | 2024.05.16 |
윈도우로 그누보드 서버 공유기 apache , autoset 등에서 curl 에러 (0) | 2024.05.01 |
그누보드5 개인정보 없이 회원가입 이메일 사용안함 (1) | 2024.04.29 |
그누보드 이미지 500 에러 오토셋 url 관련 에러 httpd-vhosts.conf (0) | 2024.04.28 |
- Total
- Today
- Yesterday
- lsposed
- 에러
- 회원가입
- php8
- 셀레니움
- SSL
- .htaccess
- python
- 파이선
- 윈도우
- 아파치
- xe
- 루팅
- 아미나
- 당근
- Cloudflare
- 파이썬
- 그누보드5
- php
- 유튜브
- 텔레그램
- 제로보드
- 오토셋
- Fullcalendar
- Apache
- 클라우드플레어
- 멀티계정
- 그누보드
- Magisk
- 텔레그램봇
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |