Files
jongryangje/app/Helpers/pii_mask_helper.php
taekyoungc 71edc1eb20 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
2026-04-08 15:22:24 +09:00

85 lines
2.5 KiB
PHP

<?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);
}
}