[security]쇼핑몰 update 엔드포인트 CSRF 보호 추가
This commit is contained in:
1 parent
92a052fa7a
commit
3e0e8be6da
8 files changed
+78
No files matched your search
@@ -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)를 반드시 포함해야 한다.
|
||||
|
||||
@@ -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'] : '';
|
||||
|
||||
@@ -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;
|
||||
|
||||
// 보관기간이 지난 상품 삭제
|
||||
|
||||
@@ -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("상품문의는 회원만 작성이 가능합니다.");
|
||||
}
|
||||
|
||||
@@ -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("사용후기는 회원만 작성이 가능합니다.");
|
||||
}
|
||||
|
||||
@@ -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('회원 로그인 후 이용해 주십시오.');
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user