- adm/qa_config_update.php / adm/contentformupdate.php : qa_include_head/tail, co_include_head/tail 가 super 가드 없이 변경 가능해 하위 관리자가 임의 PHP 경로를 include 시킬 수 있던 LFI 위험을 board_form_update.php 와 동일한 패턴(super 외에는 기존 값 유지)으로 차단. - adm/member_form_update.php / adm/member_list_update.php : 신규 회원 생성·일괄 수정 시 부여하려는 mb_level 상한 검증이 없어 하위 관리자가 자기보다 높은 등급을 부여할 수 있던 권한 상승을 차단. - adm/shop_admin/categorylistupdate.php / adm/shop_admin/itemformupdate.php : is_include_path_check 호출에서 두 번째 인자(is_input=1) 누락으로 rar/php/zip wrapper 등 경로 wrapper 차단이 동작하지 않던 부분을 is_include_path_check($file, 1) 로 강화. - adm/shop_admin/orderdeliveryupdate.php / adm/shop_admin/orderpartcancelupdate.php / adm/sendmail_test.php : 상태 변경 동작에 check_admin_token() 누락으로 발생하던 CSRF 위험을 토큰 검증 추가로 차단. sendmail_test 폼에는 hidden token 필드 추가. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
116 lines
5.4 KiB
PHP
116 lines
5.4 KiB
PHP
<?php
|
|
$sub_menu = "200100";
|
|
require_once './_common.php';
|
|
|
|
check_demo();
|
|
|
|
if (!(isset($_POST['chk']) && is_array($_POST['chk']))) {
|
|
alert($_POST['act_button'] . " 하실 항목을 하나 이상 체크하세요.");
|
|
}
|
|
|
|
auth_check_menu($auth, $sub_menu, 'w');
|
|
|
|
check_admin_token();
|
|
|
|
$mb_datas = array();
|
|
$msg = '';
|
|
|
|
if ($_POST['act_button'] == "선택수정") {
|
|
for ($i = 0; $i < count($_POST['chk']); $i++) {
|
|
// 실제 번호를 넘김
|
|
$k = isset($_POST['chk'][$i]) ? (int) $_POST['chk'][$i] : 0;
|
|
|
|
$post_mb_certify = (isset($_POST['mb_certify'][$k]) && $_POST['mb_certify'][$k]) ? clean_xss_tags($_POST['mb_certify'][$k], 1, 1, 20) : '';
|
|
$post_mb_level = isset($_POST['mb_level'][$k]) ? (int) $_POST['mb_level'][$k] : 0;
|
|
$post_mb_intercept_date = (isset($_POST['mb_intercept_date'][$k]) && $_POST['mb_intercept_date'][$k]) ? clean_xss_tags($_POST['mb_intercept_date'][$k], 1, 1, 8) : '';
|
|
$post_mb_mailling = isset($_POST['mb_mailling'][$k]) ? (int) $_POST['mb_mailling'][$k] : 0;
|
|
$post_mb_sms = isset($_POST['mb_sms'][$k]) ? (int) $_POST['mb_sms'][$k] : 0;
|
|
$post_mb_open = isset($_POST['mb_open'][$k]) ? (int) $_POST['mb_open'][$k] : 0;
|
|
|
|
$agree_items = [];
|
|
// 광고성 이메일 수신동의 일자 추가
|
|
$post_mb_mailling_default = isset($_POST['mb_mailling_default'][$k]) ? (int) $_POST['mb_mailling_default'][$k] : 0;
|
|
$sql_mailling_date = "";
|
|
if ($post_mb_mailling_default != $post_mb_mailling) {
|
|
$sql_mailling_date = " , mb_mailling_date = '".G5_TIME_YMDHIS."' ";
|
|
$agree_items[] = "광고성 이메일 수신(" . ($post_mb_mailling == 1 ? "동의" : "철회") . ")";
|
|
}
|
|
|
|
// 광고성 SMS/카카오톡 수신동의 일자 추가
|
|
$post_mb_sms_default = isset($_POST['mb_sms_default'][$k]) ? (int) $_POST['mb_sms_default'][$k] : 0;
|
|
$sql_sms_date = "";
|
|
if ($post_mb_sms_default != $post_mb_sms) {
|
|
$sql_sms_date = " , mb_sms_date = '".G5_TIME_YMDHIS."' ";
|
|
$agree_items[] = "광고성 SMS/카카오톡 수신(" . ($post_mb_sms == 1 ? "동의" : "철회") . ")";
|
|
}
|
|
|
|
// 동의 로그 추가
|
|
$sql_agree_log = "";
|
|
if (!empty($agree_items)) {
|
|
$agree_log = "[".G5_TIME_YMDHIS.", 회원관리 선택수정] " . implode(' | ', $agree_items) . "\n";
|
|
$sql_agree_log .= " , mb_agree_log = CONCAT('{$agree_log}', IFNULL(mb_agree_log, ''))";
|
|
}
|
|
|
|
$mb_datas[] = $mb = get_member($_POST['mb_id'][$k]);
|
|
|
|
if (!(isset($mb['mb_id']) && $mb['mb_id'])) {
|
|
$msg .= $mb['mb_id'] . ' : 회원자료가 존재하지 않습니다.\\n';
|
|
} elseif ($is_admin != 'super' && $mb['mb_level'] >= $member['mb_level']) {
|
|
$msg .= $mb['mb_id'] . ' : 자신보다 권한이 높거나 같은 회원은 수정할 수 없습니다.\\n';
|
|
} elseif ($is_admin != 'super' && $post_mb_level >= (int) $member['mb_level']) {
|
|
$msg .= $mb['mb_id'] . ' : 자신보다 권한이 높거나 같은 등급은 부여할 수 없습니다.\\n';
|
|
} elseif ($member['mb_id'] == $mb['mb_id']) {
|
|
$msg .= $mb['mb_id'] . ' : 로그인 중인 관리자는 수정 할 수 없습니다.\\n';
|
|
} else {
|
|
if ($post_mb_certify) {
|
|
$mb_adult = isset($_POST['mb_adult'][$k]) ? (int) $_POST['mb_adult'][$k] : 0;
|
|
} else {
|
|
$mb_adult = 0;
|
|
}
|
|
|
|
$sql = " update {$g5['member_table']}
|
|
set mb_level = '" . $post_mb_level . "',
|
|
mb_intercept_date = '" . sql_real_escape_string($post_mb_intercept_date) . "',
|
|
mb_mailling = '" . $post_mb_mailling . "',
|
|
mb_sms = '" . $post_mb_sms . "',
|
|
mb_open = '" . $post_mb_open . "',
|
|
mb_certify = '" . sql_real_escape_string($post_mb_certify) . "',
|
|
mb_adult = '{$mb_adult}'
|
|
{$sql_mailling_date}
|
|
{$sql_sms_date}
|
|
{$sql_agree_log}
|
|
where mb_id = '" . sql_real_escape_string($mb['mb_id']) . "' ";
|
|
sql_query($sql);
|
|
}
|
|
}
|
|
} elseif ($_POST['act_button'] == "선택삭제") {
|
|
for ($i = 0; $i < count($_POST['chk']); $i++) {
|
|
// 실제 번호를 넘김
|
|
$k = isset($_POST['chk'][$i]) ? (int) $_POST['chk'][$i] : 0;
|
|
|
|
$mb_datas[] = $mb = get_member($_POST['mb_id'][$k]);
|
|
|
|
if (!$mb['mb_id']) {
|
|
$msg .= $mb['mb_id'] . ' : 회원자료가 존재하지 않습니다.\\n';
|
|
} elseif ($member['mb_id'] == $mb['mb_id']) {
|
|
$msg .= $mb['mb_id'] . ' : 로그인 중인 관리자는 삭제 할 수 없습니다.\\n';
|
|
} elseif (is_admin($mb['mb_id']) == 'super') {
|
|
$msg .= $mb['mb_id'] . ' : 최고 관리자는 삭제할 수 없습니다.\\n';
|
|
} elseif ($is_admin != 'super' && $mb['mb_level'] >= $member['mb_level']) {
|
|
$msg .= $mb['mb_id'] . ' : 자신보다 권한이 높거나 같은 회원은 삭제할 수 없습니다.\\n';
|
|
} else {
|
|
// 회원자료 삭제
|
|
member_delete($mb['mb_id']);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($msg) {
|
|
//echo '<script> alert("'.$msg.'"); </script>';
|
|
alert($msg);
|
|
}
|
|
|
|
run_event('admin_member_list_update', $_POST['act_button'], $mb_datas);
|
|
|
|
goto_url('./member_list.php?' . $qstr);
|