From 69709a79a772876ea60256e580bb2a84e2c27979 Mon Sep 17 00:00:00 2001 From: whitedot Date: Tue, 8 Sep 2026 07:30:28 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=20=EC=88=98=EC=A0=95=EC=97=90=20=EB=B3=B8=EC=9D=B8?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EC=A0=95=EB=B3=B4=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI·DI 관련 식별값, 본인확인·성인인증 상태, 생년월일·성별과 인증 이력을 별도 요청으로 정리한다. 일반 회원정보와 이메일 인증 상태는 유지하고 삭제할 정보가 없는 경우 버튼을 숨긴다. 회원 수정·삭제 권한과 대상 회원 등급, POST·관리자 토큰·요청 출처를 검증한다. 검증: 변경 PHP 3개 문법 검사, 임시 DB의 권한·토큰·출처·대상 정보 삭제 및 다른 회원 보존 검사 통과. 브라우저에서 별도 폼 제출과 관리자 토큰 삽입 확인. --- adm/admin.lib.php | 24 ++++++++++++++++++++++++ adm/member_cert_cleanup.php | 30 ++++++++++++++++++++++++++++++ adm/member_form.php | 21 +++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 adm/member_cert_cleanup.php diff --git a/adm/admin.lib.php b/adm/admin.lib.php index 1d2d70a97..6ebc6181a 100644 --- a/adm/admin.lib.php +++ b/adm/admin.lib.php @@ -478,6 +478,30 @@ function check_log_folder($log_path, $is_delete = true) } } +// 회원 본인확인 식별값과 인증 이력만 정리한다. 호출부에서 관리자 권한을 검증한다. +function admin_clear_member_certification($mb_id) +{ + global $g5; + + $esc_mb_id = sql_real_escape_string($mb_id); + $history_table = isset($g5['member_cert_history_table']) ? $g5['member_cert_history_table'] : G5_TABLE_PREFIX.'member_cert_history'; + + // 일반 회원정보(이름·연락처)와 이메일 인증 상태는 유지한다. + if (!sql_query(" update {$g5['member_table']} + set mb_certify = '', mb_adult = 0, mb_dupinfo = '', mb_birth = '', mb_sex = '' + where mb_id = '{$esc_mb_id}' ", false)) { + return false; + } + if (!sql_query(" delete from {$history_table} where mb_id = '{$esc_mb_id}' ", false)) { + return false; + } + if (!sql_query(" delete from {$g5['cert_history_table']} where mb_id = '{$esc_mb_id}' ", false)) { + return false; + } + + return true; +} + // POST로 넘어온 토큰과 세션에 저장된 토큰 비교 function check_admin_token() { diff --git a/adm/member_cert_cleanup.php b/adm/member_cert_cleanup.php new file mode 100644 index 000000000..fce93fb42 --- /dev/null +++ b/adm/member_cert_cleanup.php @@ -0,0 +1,30 @@ += $member['mb_level'] || is_admin($mb['mb_id']) === 'super')) { + alert('자신보다 권한이 높거나 같은 회원의 본인확인 정보는 삭제할 수 없습니다.'); +} + +if (!admin_clear_member_certification($mb['mb_id'])) { + alert('본인확인 정보를 모두 삭제하지 못했습니다. DB 상태를 확인한 뒤 다시 시도해 주십시오.'); +} + +alert('본인확인 정보와 인증 내역을 삭제했습니다.', './member_form.php?w=u&mb_id='.urlencode($mb['mb_id'])); diff --git a/adm/member_form.php b/adm/member_form.php index 9a47fd310..77e6a302b 100644 --- a/adm/member_form.php +++ b/adm/member_form.php @@ -438,6 +438,20 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js 본인인증 내역이 없습니다. + 0 || !empty($mb['mb_dupinfo']) || !empty($mb['mb_certify']) + || !empty($mb['mb_adult']) || !empty($mb['mb_birth']) || !empty($mb['mb_sex']); + if ($w === 'u' && !$has_certification_data) { + $cert_request = sql_fetch("select count(*) as cnt from {$g5['cert_history_table']} where mb_id = '".sql_real_escape_string($mb['mb_id'])."'"); + $has_certification_data = !empty($cert_request['cnt']); + } + $can_cleanup_certification = $w === 'u' && $has_certification_data + && ($is_admin === 'super' || (isset($auth[$sub_menu]) && strpos($auth[$sub_menu], 'd') !== false)); + ?> + +

본인확인 ‘아니오’는 인증 상태만 변경합니다. 정보 삭제는 CI/DI 관련 식별값, 본인확인·성인인증 상태, 생년월일·성별 및 본인인증 내역을 삭제합니다. 회원 이름과 연락처는 유지합니다.

+ + @@ -598,6 +612,13 @@ add_javascript(G5_POSTCODE_JS, 0); //다음 주소 js + +
+ + +
+ +