默认验证码让我被采集器刷到服务器崩溃
记得那是刚接手一个老站的时候,后台每天注册量突然暴涨到几百个,IP还全是境外机房的,一开始我还挺高兴,以为是内容做起来了,结果一看数据库,全是垃圾账号,评论里塞满了外链广告,检查才发现,苹果CMS默认的验证码——简单算术题,那玩意儿连OCR都不用,直接正则匹配图片上的数字就能过,采集器几分钟就能注册上千个号,然后疯狂发帖灌水,更坑的是,那个验证码图片生成逻辑有个bug:当PHP的GD库版本太低时,图片会渲染成纯黑块,用户根本看不清数字,结果就是正常访客也注册不了,天天有人留言骂网站不能用。
关键教训:苹果CMS自带的验证码是给演示站用的,生产环境千万别用,而且版本不同,默认验证码的位置和逻辑也不一样(v10和v11甚至后台路径都改过),我当时花了整整两天排查问题,最后发现是GD库配置问题,但即使修好了,那个验证码强度依然不行。
解决方案:两步走,从“防君子”变成“防小人”
第一步:关掉默认验证码,用第三方接口
苹果CMS的后台路径是 /admin(如果你没改的话),进入系统设置 → 用户配置 → 注册设置,先把“启用验证码”关掉——别怕,这不是让你裸奔,而是为了替换更靠谱的方案。
推荐直接上极验(GEETEST)验证码,也就是大家常说的“滑动验证码”,苹果CMS官方其实有集成插件,但很多老版本需要手动改代码,具体操作:

苹果CMS验证码设置的那些坑,用钱砸出来的经验,今天全交代了
- 去极验官网注册,获取
captcha_id和private_key(免费版每天有额度,个人站完全够用)。 - 在苹果CMS的
/config/目录下找到captcha.php(如果不存在就新建一个),写入配置代码:
return [
'type' => 'geetest',
'geetest_id' => '你的ID',
'geetest_key' => '你的KEY',
];
- 修改注册页模板
/template/你的主题/html/user_reg.html,把默认的验证码HTML替换成极验的JS调用代码,注意:苹果CMS的验证码输出函数是show_verify(),记得在提交表单时把极验的验证结果一起POST过去。
如果你不想折腾代码,还有更省事的方案:腾讯云验证码(Captcha),它的插件可以直接在苹果CMS的应用中心搜到(前提是你用的是官方正版或兼容版本),安装后去腾讯云控制台配置,然后后台启用即可,全程点点点,十几分钟搞定。
第二步:给常规图形验证码“加量”
如果因为某些原因(比如站是内网访问、用户反馈滑动验证码太卡),你还得用图形验证码,那么别用自带的,推荐 Recaptcha v2(谷歌验证码),虽然国内要过墙,但可以用代理插件比如 GeeTest 的国内镜像,或者自己改一个简单的中文汉字验证码——苹果CMS自带的验图片生成类在 /extend/Verify/ 下,你可以替换成开源的 php-simple-captcha,把字符集改为中文或者加上干扰线、变形扭曲,我自己的经验是:把字体设为手写体、背景加随机噪点、字符间距随机、颜色抖动,这样采集器的OCR基本报废,实测跑了一周,注册机一个都没突破。
推荐配置与插件清单(直接抄作业)
| 场景 | 推荐方案 | 预算 | 维护成本 |
|---|---|---|---|
| 新站、访客多 | 极验免费版 + 苹果CMS官方插件 | 0元(日请求量<5000) | 几乎零维护 |
| 老站、不想改代码 | 腾讯云验证码(基础版) | 前100万次免费,之后约0.01元/次 | 后台直接启用 |
| 内网或海外站 | Recaptcha v2 无验证 | 0元 | 每月检查一次key是否过期 |
| 技术派、要极致安全 | 自写图形验证码(汉字+噪声) | 0元 | 首次配置1小时,后续看心情 |
避坑提醒:千万别用那种“点选图片中的某某物体”的第三方验证码(比如12306那种),虽然安全性高,但在手机上体验极差,用户流失率能到30%以上,苹果CMS大部分流量来自移动端,选择轻量级滑动验证码最平衡。
长期维护建议:别等被攻破了再后悔
验证码不是万能的
即使上了极验,也要在后台做频率限制,具体操作:在 application/common.php 里加一个IP请求计数器,对 “注册”、“评论”、“发帖”这些操作,同一IP每5分钟只能请求3次,代码很简单:
$ip = get_client_ip();
$cache = Cache::get('ip_limit_'.$ip);
if($cache && $cache > 3) {
return json(['code'=>0,'msg'=>'操作太频繁,请稍后再试']);
}
Cache::set('ip_limit_'.$ip, $cache?$cache+1:1, 300);
定期更新验证码库
如果你用图形验证码,每个月换一次字体和干扰图片,因为采集器会针对特定样式训练模型——现实中我就见过有人专门针对苹果CMS默认字体“msyh.ttf”做了OCR模型,一识别一个准,去网上找几个免费手写字体,站酷快乐体”、“仓耳渔火体”之类,放在 /public/fonts/ 下,然后修改配置文件里的字体路径。
监控异常注册
写个简单的定时脚本,每天凌晨扫描注册表(user),如果某小时注册量超过平时5倍,立刻短信通知,我用的方法是:在 crontab 里每30分钟跑一次:
php /你网站的路径/cron/check_register.php
就是取当前小时注册数,对比历史平均值,超标就发邮件或通过企业微信机器人告警,这样就算验证码被绕过,也能在半小时内发现。
不要过度拦截
很多新手发现验证码被绕过,就一股脑上“手机号验证”或“邮箱验证”,结果用户体验极差,苹果CMS的很多用户是看视频的,他们想注册只是因为想收藏视频,你让他们填手机号?直接流失,我的原则是:验证码只拦机器,不拦真人,滑动验证码 + 频率限制,已经能挡住99%的恶意操作,剩下的1%靠人工审核,比如新账号前3天不能发帖,这样成本最低。
最后说个大实话
苹果CMS验证码这个问题,网上教程一搜一大把,但大多数都是复制粘贴的官方文档,根本不考虑你的服务器环境,比如有些教程让你开启 fileinfo 扩展,结果你服务器上是宝塔面板默认禁用了,一开就导致其他功能报错,所以我建议:先备份再动手,修改任何验证码相关文件前,把 /extend/ 和 /config/ 整个目录打包一下,别问我为什么强调这句话——因为我就干过直接覆盖文件导致后台密码验证码也炸掉的事情,最后只能重装系统恢复数据,那个周末的夜晚想起来就想抽自己。
验证码是网站的第一道门,别省那点时间和预算,花半天配置好,接下来一年都不用管,不然等你被采集器刷到数据库爆满时,再后悔就来不及了。
发表评论