
本文介绍一种通过预处理+精确匹配的方式,精准识别形如 `a#b#c#d#e#f.com` 或 `a b c d e f.com` 等混淆拼接的恶意域名,避免传统正则误杀,提升反垃圾过滤的准确率与鲁棒性。
在对抗持续进化的垃圾信息发送者时,单纯依赖复杂正则表达式(如基于字符顺序和分隔符的模糊匹配)往往导致高误报率——例如原始代码中使用 (?
更可靠的做法是:先归一化(sanitization),再精确判定。核心思路是剥离所有非字母数字字符,还原出“干净”的纯字母序列,再判断是否包含目标关键词(如 abcdef):
// 步骤1:移除所有非字母数字字符(保留 a-z, A-Z, 0-9)
$cleaned = preg_replace('/[^A-Za-z0-9]/', '', $textfield);
// 步骤2:检查清洗后字符串是否包含目标域名主体(不区分大小写)
if (stripos($cleaned, 'abcdef') !== false) {
// 触发拦截逻辑,例如标记为垃圾、拒绝提交或加入黑名单
throw new Exception('Suspicious obfuscated domain detected.');
}✅ 优势说明:
- ✅ 高精度:仅当 a, b, c, d, e, f 按序连续出现(中间无干扰字符)时才触发,完全规避乱序匹配问题;
- ✅ 强鲁棒性:自动兼容 a.b.c.d.e.f.com、a-b-c-d-e-f.com、a【b】c【d】e【f】.com 等数十种变体;
- ✅ 低开销:两次轻量级字符串操作,远优于多层嵌套正则回溯,性能稳定;
- ✅ 可扩展:支持批量检测,只需维护一个关键词数组:
$spamKeywords = ['abcdef', 'xyzspam', 'phishlink']; foreach ($spamKeywords as $kw) { if (stripos($cleaned, $kw) !== false) { return true; // 恶意命中 } }
⚠️ 注意事项:
- 若需防止 abcdefg(超长匹配)被误判,可改用单词边界匹配:preg_match('/\b' . preg_quote('abcdef', '/') . '\b/i', $cleaned),但通常域名主体本身无空格,直接 stripos 更高效;
- 建议结合其他维度(如高频提交 IP、相似文本聚类、DNS 可解析性校验)构建多层防御,避免单点绕过;
- 对用户可见内容(如评论、表单),清洗后应保留原始文本用于审计,仅将 $cleaned 用于检测逻辑。
该方法已在多个社区平台反 spam 实践中验证有效,兼顾准确性、可维护性与执行效率,是应对“字符混淆型”域名攻击的推荐方案。










