feat: add designated shop detail and PII masking updates
Rebase current admin changes on top of origin/main and exclude local artifacts from tracking to reduce push payload. Made-with: Cursor
This commit is contained in:
84
app/Helpers/pii_mask_helper.php
Normal file
84
app/Helpers/pii_mask_helper.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* 화면 표시용 개인정보 비식별화 (저장 값은 변경하지 않음).
|
||||
* ENC: 접두사 값은 pii_decrypt 후 마스킹한다.
|
||||
*/
|
||||
|
||||
helper('pii_encryption');
|
||||
|
||||
if (! function_exists('mask_person_name')) {
|
||||
/**
|
||||
* 인명 마스킹 (예: 홍길동 → 홍*동, 김철 → 김*, 남궁민수 → 남**수).
|
||||
*/
|
||||
function mask_person_name(?string $name): string
|
||||
{
|
||||
if ($name === null) {
|
||||
return '';
|
||||
}
|
||||
$plain = pii_decrypt(trim($name));
|
||||
if ($plain === '') {
|
||||
return '';
|
||||
}
|
||||
$len = mb_strlen($plain, 'UTF-8');
|
||||
if ($len <= 1) {
|
||||
return '*';
|
||||
}
|
||||
if ($len === 2) {
|
||||
return mb_substr($plain, 0, 1, 'UTF-8') . '*';
|
||||
}
|
||||
$first = mb_substr($plain, 0, 1, 'UTF-8');
|
||||
$last = mb_substr($plain, -1, 1, 'UTF-8');
|
||||
if ($len === 3) {
|
||||
return $first . '*' . $last;
|
||||
}
|
||||
|
||||
return $first . str_repeat('*', $len - 2) . $last;
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('mask_mobile_phone')) {
|
||||
/**
|
||||
* 휴대·개인 전화 표시용 (예: 010-1234-5678 → 010-****-5678).
|
||||
* 10자리(02 등)·11자리 휴대번호·+82 형태를 단순 정규화 후 처리한다.
|
||||
*/
|
||||
function mask_mobile_phone(?string $phone): string
|
||||
{
|
||||
if ($phone === null) {
|
||||
return '';
|
||||
}
|
||||
$plain = pii_decrypt(trim($phone));
|
||||
if ($plain === '') {
|
||||
return '';
|
||||
}
|
||||
$digits = preg_replace('/\D+/', '', $plain) ?? '';
|
||||
if ($digits === '') {
|
||||
return '';
|
||||
}
|
||||
if (str_starts_with($digits, '82') && strlen($digits) >= 12) {
|
||||
$digits = '0' . substr($digits, 2);
|
||||
}
|
||||
$len = strlen($digits);
|
||||
if ($len < 7) {
|
||||
return str_repeat('*', min(11, max(4, $len)));
|
||||
}
|
||||
// 7~9자리도 실제 앞자리(통상 010 등)를 노출하고 가운데만 **** (***-****-xxxx 방지)
|
||||
if ($len < 10) {
|
||||
return substr($digits, 0, 3) . '-****-' . substr($digits, -4);
|
||||
}
|
||||
if ($len === 10) {
|
||||
if (str_starts_with($digits, '02')) {
|
||||
return '02-****-' . substr($digits, -4);
|
||||
}
|
||||
|
||||
return substr($digits, 0, 3) . '-****-' . substr($digits, -4);
|
||||
}
|
||||
if ($len === 11) {
|
||||
return substr($digits, 0, 3) . '-****-' . substr($digits, -4);
|
||||
}
|
||||
|
||||
return substr($digits, 0, 3) . '-****-' . substr($digits, -4);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user