
本文介绍一种实用策略:先清理文本中的非字母数字字符,再精确匹配可疑域名根字符串,避免传统正则误杀,有效应对拼接式垃圾链接(如 a#b#c#d#e#f.com)。
在对抗持续性 spam 攻击时,单纯依赖复杂正则(如 (?分两步走:标准化 + 精确匹配。
✅ 第一步:文本净化(Sanitization)
使用 preg_replace 移除所有非字母、非数字字符,保留原始语义骨架:
$cleaned = preg_replace('/[^A-Za-z0-9]/', '', $textfield);
// 示例:
// "a$b$c$d$e$f.com" → "abcdefcom"
// "a b c d e f.com" → "abcdefcom"
// "a#b#c#d#e#f.com" → "abcdefcom"⚠️ 注意:此操作会合并相邻域名与后缀(如 abcdef.com → abcdefcom),因此第二步需匹配无点号的纯根字符串(如 'abcdef'),而非完整域名 'abcdef.com'。
✅ 第二步:精确子串检测
使用 strpos() 高效判断净化后字符串是否包含目标关键词(区分大小写可选):
if (stripos($cleaned, 'abcdef') !== false) {
// 触发反垃圾逻辑:拒绝提交、标记为垃圾、记录日志等
throw new Exception('Suspicious obfuscated domain detected.');
}stripos() 比 preg_match 开销更低,且语义清晰——我们只关心“是否含有该连续字符序列”,不涉及位置、边界或顺序变异。
? 进阶建议
-
多域名支持:将黑名单存入数组,循环检测:
$blacklist = ['abcdef', 'xyzspam', 'phishlink']; foreach ($blacklist as $domainRoot) { if (stripos($cleaned, $domainRoot) !== false) { return false; } } - 结合长度/频率限制:对高频出现的异常长字符串(如 >30 字符且含大量符号)追加启发式过滤。
- 前端+后端双校验:前端做轻量提示,后端强制执行,防止绕过。
该方案兼顾准确性、性能与可维护性,已在多个社区系统中稳定拦截此类“符号分割型”垃圾推广,推荐作为基础防护层的核心逻辑。










