当前位置:首页 > AI技术 > 正文内容

理如何在Think中对敏感数据脱敏 获取器动态替换手机号中间星号加密|Duuu笔记

admin3天前AI技术7

深入理解PHP原理,本文探讨

在ThinkPHP模型获取器中用getMobileAttr方法结合substr_replace实现手机号脱敏,需判空防错,脱敏后所有输出路径均生效,关联模型需单独定义。

ThinkPHP 获取器里怎么写手机号脱敏逻辑

直接在模型的获取器(accessor)里做字符串替换,别在控制器或视图里临时处理。ThinkPHP 会自动在读取字段时触发获取器,适合统一脱敏。

关键点是:获取器函数名必须是

get{Field}Attr

格式,且参数固定为

$value

;脱敏逻辑要判断值是否为空或非字符串,避免报错。

手机号字段假设叫

mobile

,对应获取器函数名就是

getMobileAttr

substr_replace()

比正则更轻量,也更可控

必须加空值判断,否则查不到数据时

$value

null

substr_replace(null, ...)

会警告

public function getMobileAttr($value)

{

if (empty($value) || !is_string($value)) {

return $value;

}

return substr_replace($value, '****', 3, 4);

}

为什么不用正则或自定义函数封装

正则在简单脱敏场景下属于杀鸡用牛刀——

substr_replace()

更快、无 PCRE 依赖、不触发额外编译开销。ThinkPHP 6+ 默认关闭了正则缓存,每次调用都重新解析,对高频列表页有感知延迟。

也不建议抽成独立工具函数再调用,因为获取器本身是“透明增强”,一旦引入外部依赖,就可能破坏模型序列化、JSON 输出等默认行为。

PHP免费学习笔记(深入)

”;

substr_replace($mobile, '****', 3, 4)

直接从第 4 位(索引 3)开始替换成 4 个星号,适配 11 位手机号

如果数据库存的是带区号或国际码(如 +8613812345678),先用

preg_replace('/[^0-9]/', '', $value)

清洗再截取

别用

str_replace()

,它无法按位置替换,容易误伤其他数字字段

获取器脱敏后导出 Excel 或 API 返回时还显示星号吗

会。获取器作用于模型属性读取全过程,包括

toArray()

json_encode()

export()

等所有输出路径。这是它的优势,也是陷阱。

如果导出原始数据需要明文手机号,得临时禁用获取器:

$user->getAttr('mobile', null, false)

(TP6.1+)

TP6.0 及以下不支持跳过获取器,只能用

$user->getData('mobile')

绕过

API 接口若需同时返回脱敏版和明文版,不要新增字段,改用

append

添加一个

mobile_raw

属性,显式控制

脱敏后搜索还能搜到原手机号吗

不能。获取器只影响读取,不影响查询条件。你在

where('mobile', '138****5678')

是搜不到的——数据库存的是完整号码,而你传入的是脱敏串。

搜索必须用原始值。常见错误是前端把脱敏后的

138****5678

发给后端当查询条件,后端没校验直接拼进 where,结果永远查不到。

搜索接口应约定只接收原始手机号,或加个

search_mobile

字段专用于模糊查

如果必须支持“输脱敏号也能搜”,得在搜索前反推:比如把

138****5678

替换成

138%5678

,再用

like

查询,但注意性能和准确性

别在获取器里做

LIKE

匹配,那是查询层的事,不是展示层的职责

最常被忽略的一点:获取器不会自动生效于关联模型的字段。比如

User::with('profile')->find()

,如果

profile.mobile

也要脱敏,得在

Profile

模型里单独定义

getMobileAttr

—— 这个得一个个补,没有继承或全局配置。

相关文章

【深度学习】Java DL4J 2024年度技术总结

一、Java DL4J深度学习概述 1.1 DL4J框架简介 1.2 与其他深度学习框架的比较 1.3 DL4J 的优势 1.3.1 与 Java 生态系统的无...

【大模型应用开发

二、大模型的泛化与微调 模型的泛化能力:是指一个模型在面对新的、未见过的数据时,能够正确理解和预测这些数据的能力。在机器学习和人工智能领域,模型的泛化能力是评估模型性能的重要指标之一。...

什么是LLM?看这一篇就够了!

一、全套AGI大模型学习路线 AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能! 二、640套AI大模型报告合集 这套包含640份报告的合集,涵盖了AI大...

LLM介绍

。LLM 被证明在使用指令形式化描述的未见过的任务上表现良好。这意味着 LLM 能够根据任务指令执行任务,而无需事先见过具体示例,展示了其强大的泛化能力。 :小型语言模型通常难以解决涉...

神经网络中的单层神经网络

神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。 看一个经典的神经网络。这是一个包...

推荐10个AI人工智能技术网站

除了研究和开发人工智能技术,OpenAI还积极参与人工智能伦理和安全的研究和探讨。 认为,人工智能技术的发展必须遵循伦理和法律的规范,以确保人工智能的应用不会对人类带来负面影响。...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。