[security]쇼핑몰 update 엔드포인트 CSRF 보호 추가

This commit is contained in:
thisgun committed 2026-04-16 02:02:26 +00:00
1 parent 92a052fa7a
commit 3e0e8be6da
8 files changed
+78

No files matched your search

+55
View File
@@ -2467,6 +2467,61 @@ function check_token()
return true;
}
/**
* CSRF 방지용 Origin/Referer 검증 (OWASP 권장 패턴).
*
* 브라우저가 자동으로 보내는 Origin 헤더를 우선 확인하고, 없으면 Referer를 사용해
* 요청이 현재 사이트에서 발생했는지 검증한다. 크로스 오리진에서 유입된 요청은
* 두 헤더 모두 공격자가 제어할 수 없으므로 위조가 불가능하다.
*
* 폼 파일(스킨) 수정 없이 처리 파일에만 호출을 추가하면 되므로 적용 범위가 넓고
* 커스텀 테마 호환성에 영향이 없다.
*
* 특수 환경(프록시 등)에서 헤더가 유실되는 경우 G5_DISABLE_ORIGIN_CHECK 상수로
* 비활성화할 수 있다.
*
* @param string $redirect_url 검증 실패 시 리다이렉트할 URL (기본: G5_URL)
* @return bool
*/
function check_request_origin($redirect_url = '')
{
// 환경에 따라 opt-out 가능
if (defined('G5_DISABLE_ORIGIN_CHECK') && G5_DISABLE_ORIGIN_CHECK) {
return true;
}
if (!$redirect_url) {
$redirect_url = defined('G5_URL') ? G5_URL : '/';
}
// Origin 우선, 없으면 Referer 사용
$origin = isset($_SERVER['HTTP_ORIGIN']) ? trim($_SERVER['HTTP_ORIGIN']) : '';
$referer = isset($_SERVER['HTTP_REFERER']) ? trim($_SERVER['HTTP_REFERER']) : '';
$source = $origin !== '' ? $origin : $referer;
if ($source === '') {
alert('올바른 경로로 접근해 주십시오.', $redirect_url);
}
$source_host = @parse_url($source, PHP_URL_HOST);
if (!$source_host) {
alert('올바른 경로로 접근해 주십시오.', $redirect_url);
}
// 현재 서버 호스트 (포트 분리)
$server_host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
$colon = strpos($server_host, ':');
if ($colon !== false) {
$server_host = substr($server_host, 0, $colon);
}
if (!$server_host || strcasecmp($source_host, $server_host) !== 0) {
alert('올바른 경로로 접근해 주십시오.', $redirect_url);
}
return true;
}
/**
* 브라우저 검증을 위한 세션 반환 및 재생성
* @param array $member 로그인 된 회원의 정보. 가입일시(mb_datetime)를 반드시 포함해야 한다.
+5
View File
@@ -2,6 +2,11 @@
include_once('./_common.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');
// CSRF 방지: 무통장입금만 Origin/Referer 검증 (PG 결제는 PG사에서 검증하므로 제외)
if (isset($od_settle_case) && $od_settle_case == '무통장' && function_exists('check_request_origin')) {
check_request_origin(G5_SHOP_URL);
}
$post_p_hash = isset($_POST['P_HASH']) ? $_POST['P_HASH'] : '';
$post_enc_data = isset($_POST['enc_data']) ? $_POST['enc_data'] : '';
$post_enc_info = isset($_POST['enc_info']) ? $_POST['enc_info'] : '';
+3
View File
@@ -1,6 +1,9 @@
<?php
include_once('./_common.php');
// CSRF 방지: Origin/Referer 헤더로 요청 출처 검증
if (function_exists('check_request_origin')) check_request_origin(G5_SHOP_URL);
// print_r2($_POST); exit;
// 보관기간이 지난 상품 삭제
+3
View File
@@ -1,6 +1,9 @@
<?php
include_once('./_common.php');
// CSRF 방지: Origin/Referer 헤더로 요청 출처 검증
if (function_exists('check_request_origin')) check_request_origin(G5_SHOP_URL);
if (!$is_member) {
alert_close("상품문의는 회원만 작성이 가능합니다.");
}
+3
View File
@@ -1,6 +1,9 @@
<?php
include_once('./_common.php');
// CSRF 방지: Origin/Referer 헤더로 요청 출처 검증
if (function_exists('check_request_origin')) check_request_origin(G5_SHOP_URL);
if (!$is_member) {
alert_close("사용후기는 회원만 작성이 가능합니다.");
}
+3
View File
@@ -1,6 +1,9 @@
<?php
include_once('./_common.php');
// CSRF 방지: Origin/Referer 헤더로 요청 출처 검증
if (function_exists('check_request_origin')) check_request_origin(G5_SHOP_URL);
if($is_guest)
die('회원 로그인 후 이용해 주십시오.');
+5
View File
@@ -2,6 +2,11 @@
include_once('./_common.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');
// CSRF 방지: 무통장입금만 Origin/Referer 검증 (PG 결제는 PG사에서 검증하므로 제외)
if (isset($od_settle_case) && $od_settle_case == '무통장' && function_exists('check_request_origin')) {
check_request_origin(G5_SHOP_URL);
}
//이니시스 lpay 요청으로 왔다면 $default['de_pg_service'] 값을 이니시스로 변경합니다.
if( in_array($od_settle_case, array('lpay', 'inicis_kakaopay')) ){
$default['de_pg_service'] = 'inicis';
+1
View File
@@ -2,6 +2,7 @@
include_once('./_common.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');
$page_return_url = G5_SHOP_URL.'/personalpayform.php?pp_id='.get_session('ss_personalpay_id');
$pp_id = $_POST['pp_id'] = isset($_POST['pp_id']) ? preg_replace('/[^0-9]/', '', $_POST['pp_id']) : 0;