织梦自定义表单默认不带验证码,访客可以无限次提交留言,很容易被脚本机器人灌满垃圾信息,既占用数据库又影响真实的客户线索筛选。给表单加上验证码是成本最低、见效最快的防护手段。本文系统讲解织梦表单验证码怎么添加,覆盖模板修改、验证逻辑接入以及常见失效排查。
一、为什么自定义表单需要验证码
织梦自带的会员登录、评论模块都内置了验证码开关,但自定义表单属于独立模块,默认没有集成验证码字段。一旦表单 URL 被采集到,脚本可以批量构造 POST 请求写入数据库,带来以下问题:
- 表单数据表短时间内被灌入大量垃圾记录,后台难以筛选有效线索
- 占用服务器数据库资源,严重时拖慢整站响应
- 若表单配置了邮件通知,会导致邮箱被刷爆、被服务商限流
二、添加验证码的完整步骤
1. 修改表单模板增加验证码字段
进入"核心 - 频道模型 - 自定义表单",找到对应表单点击"更改",在"前台模板"或"发布模板"中加入验证码输入框与图片:
<div class="code-box"> <label for="vdcode">验证码:</label> <input type="text" name="vdcode" id="vdcode" class="ipt" size="8" maxlength="4" /> <img id="vdimgck" align="absmiddle" onclick="this.src=this.src+'?'" style="cursor:pointer;" alt="点击更换" src="/include/vdimgck.php" /> </div>
2. 提交处理页加入验证逻辑
织梦表单提交后默认跳转到 diy.php(位于网站根目录)。打开该文件,在入库前增加验证码校验:
if(preg_match("/\/dede/i", $validate)) {
$validate='';
}
if(strtolower($validate) !=strtolower($_SESSION['securimage_code_value'])) {
ShowMsg('验证码错误,请重新输入!', '-1');
exit();
}
注意不同版本的织梦验证码 session 变量名略有差异,V5.7 SP2 之后推荐使用 $_SESSION['securimage_code_value'],老版本可能是 $_SESSION['dd_ckstr']。
3. 启用 GD 库与 session
验证码图片由 /include/vdimgck.php 生成,依赖 PHP 的 GD 扩展。可在 php.ini 中确认 extension=gd 已开启,同时确保服务器 session 目录可写,否则图片显示为红叉。
三、验证码不显示或失效排查
访问 /include/vdimgck.php 直接看是否输出图片,若报错一般是 GD 库未开启或字体文件缺失。
检查表单模板中
<form> 是否设置了 enctype="multipart/form-data",部分情况下会影响 session 传递。CDN 或反向代理缓存了 vdimgck.php,导致所有用户看到同一张图,需在响应头加
Cache-Control: no-cache。提交后总是提示验证码错误,多为 session 路径不可写或前后端域名不一致引发跨域 session 丢失。
四、增强型验证码方案建议
纯字符验证码虽然能拦截大部分低级机器人,但已被 OCR 识别突破。对于高价值表单(在线咨询、预约挂号),建议在字符验证码基础上叠加以下方案:
- 接入滑块验证或行为验证(极验、腾讯防水墙)替代字符验证码
- 在 diy.php 增加同 IP 提交频率限制,例如 60 秒内只允许提交一次
- 对表单增加蜜罐字段(隐藏字段),填写即为机器人,自动丢弃
- 敏感表单要求短信验证码,结合手机号字段做二次确认
验证码上线后记得用真实流程自测一遍提交、刷新、错误回填等场景,确保不影响真实访客的转化路径。