MySQL如何查询长文本中字母数字混合的密码类敏感内容
MySQL长文本备注敏感密码检索方案
你之前的关键词匹配方案召回率不足的核心问题是过度依赖提示词,而REGEXP写法不生效通常是两个原因:一是加了^/$锚定整段文本,导致只能匹配单字段内容刚好是密码的场景;二是没处理词边界,无法识别被标点、括号、斜杠包裹的密码串。
可直接复用的查询语句
适配MySQL 8.0+版本,同时兼容关键词匹配和无关键词的字母数字混合密码识别,支持直接提取可疑密码串:
SELECT logDate, ID, -- 提取文本中第一个命中规则的可疑密码串 REGEXP_SUBSTR( comment, '\\b[a-zA-Z0-9]*([a-zA-Z][a-zA-Z0-9]*[0-9]|[0-9][a-zA-Z0-9]*[a-zA-Z])[a-zA-Z0-9]*\\b', 1, 1 ) AS suspected_credential, comment FROM logs WHERE ( -- 保留原有高准确率的关键词匹配规则 comment LIKE '%username:%' OR comment LIKE '%user id%' OR comment LIKE '%userid%' OR comment LIKE '% u:%' OR comment LIKE '%login:%' OR comment LIKE '%password:%' OR comment LIKE '%pw:%' OR comment LIKE '% p:%' ) OR ( -- 新增无关键词场景匹配:识别任意位置的字母数字混合串 comment REGEXP '\\b[a-zA-Z0-9]{6,}([a-zA-Z][a-zA-Z0-9]*[0-9]|[0-9][a-zA-Z0-9]*[a-zA-Z])[a-zA-Z0-9]*\\b' -- 排除常见非密码类混合串,可根据自身业务调整 AND comment NOT REGEXP '\\b20[0-9]{2}[a-z]{0,3}\\b' -- 排除年月格式串如202207、2023jun AND comment NOT REGEXP '\\b[a-z]{1,3}[0-9]{2,4}\\b' -- 排除常见短编码如v123、a4567 ) ORDER BY logDate DESC;
规则说明
- 正则里的
\\b是MySQL的词边界匹配符,会自动把空格、括号、斜杠、标点等非字母数字字符识别为词的分隔边界,不管密码前后跟的是括号、斜杠还是冒号,都能精准匹配,适配所有长文本场景 - 核心匹配逻辑要求连续串同时满足三个条件:长度≥6位(覆盖绝大多数网站的密码最短长度要求,过滤掉a1、2b这类无意义短混合串)、至少包含1个字母、至少包含1个数字,纯数字串(手机号、订单号)、纯字母串(普通英文单词)都不会被命中
- 针对测试场景的匹配效果:
- 含
taco123的第一条记录会被命中,直接提取出可疑值taco123 - 无混合串的第二条记录不会被返回
- 无关键词场景
helped customer login, (bob/taco123)会被新增规则识别,不会遗漏
- 含
低版本适配
如果你用的是MySQL 5.x版本,不支持REGEXP_SUBSTR函数,不影响筛选逻辑,只需要去掉SELECT里的提取字段,先把所有命中规则的记录查出来,再批量清理敏感内容即可。日常使用时可以根据业务里的正常编号格式,往NOT REGEXP部分加排除规则,进一步降低误判率。
内容的提问来源于stack exchange,提问作者Eric Tribble
相关产品推荐
相关产品推荐

