- 问题: 留言板没有验证码,导致垃圾广告留言泛滥。
- 问题: 留言验证码不显示,或者显示乱码。
下面我将针对这两种情况,提供详细的解决方案。

(图片来源网络,侵删)
为留言板添加验证码(如果原本没有)
如果你的 DedeCMS 版本比较旧,或者当初安装时没有启用验证码功能,你需要手动开启并配置它,这通常涉及修改几个核心文件。
第1步:开启后台验证码功能
这是最基本的一步,确保系统允许在留言处使用验证码。
- 登录你的 DedeCMS 后台。
- 进入 【系统】 -> 【系统基本参数】。
- 在左侧菜单中找到 【互动设置】。
- 找到 “是否启用验证码” 这个选项,将其设置为 “是”。
- 在下方,找到 “留言验证码” 选项,同样设置为 “是”。
- 点击 【确定】 保存设置。
第2步:修改前台模板文件 (guestbook.htm)
你需要在前台留言板模板中,加入显示验证码输入框和图片的 HTML 代码。
- 通过 FTP 或文件管理器,进入你的 DedeCMS 安装目录。
- 找到模板文件路径,通常是:
/templets/default/guestbook.htm。 - 用代码编辑器打开
guestbook.htm文件。 - 找到留言表单
<form ...>内部,通常在用户名、联系方式等输入框的后面,添加如下代码:
<!-- 验证码部分 -->
<div class="form-group">
<label for="vdcode">验证码:</label>
<div class="input-group">
<input type="text" name="vdcode" id="vdcode" class="form-control" style="width:120px;" />
<img src="{dede:global.cfg_cmspath/}/include/vdimgck.php" onclick="this.src='{dede:global.cfg_cmspath/}/include/vdimgck.php?'+Math.random();" alt="看不清?点击换一张" style="cursor: pointer; height: 32px;" title="看不清?点击换一张" />
</div>
</div>
<!-- 验证码部分结束 -->
代码解释:

(图片来源网络,侵删)
<input name="vdcode" ...>:这是用于输入验证码的文本框,name属性vdcode是固定的,DedeCMS 后端会识别这个名字。<img src="...">:这是用来显示验证码图片的标签。src指向了 DedeCMS 生成验证码的程序vdimgck.php。onclick="this.src='...?'+Math.random();":这段 JavaScript 代码实现了“点击图片刷新验证码”的功能,非常方便用户。
- 保存并上传
guestbook.htm文件到服务器。
第3步:修改处理留言的程序文件 (guestbook.php)
这个文件负责接收和处理前台的留言数据,你需要在这里加入验证码的校验逻辑。
- 找到并打开
/plus/guestbook.php文件。 - 在文件的开头部分,找到处理表单提交的代码段(通常在
if($dopost=='send')条件判断内)。 - 在执行数据库插入操作(类似
$dsql->ExecuteNoneQuery($query);)之前,加入以下验证码校验代码:
// 在 $dopost=='send' 的逻辑里,插入以下代码
// 验证码校验开始
if(strtolower($vdcode) != strtolower($_SESSION['vdcode']))
{
ShowMsg('验证码错误!', '-1');
exit();
}
// 验证码校验结束
代码解释:
$vdcode:这是从前台表单提交过来的验证码输入值。$_SESSION['vdcode']:这是服务器端在生成验证码图片时,保存在 Session 中的正确验证码。strtolower():将两者都转换为小写进行比较,以避免大小写敏感问题。- 如果验证失败,调用
ShowMsg()函数提示用户“验证码错误”,并终止脚本执行。
- 保存并上传
guestbook.php文件。
完成以上三步后,你的留言板就应该成功显示并校验验证码了。
留言验证码不显示或显示乱码
这种情况通常是由于服务器环境配置或文件权限问题引起的。

(图片来源网络,侵删)
常见原因及解决方案
Session 未启用或路径不可写
验证码依赖于 Session 来存储信息,Session 功能未开启,或者 Session 文件存储的目录没有写入权限,验证码就无法生成。
解决方案:
- 检查 PHP 配置 (
php.ini):- 确保
session.save_path指向一个有效的、有写入权限的目录(/tmp)。 - 确保
session.auto_start = 0(这是默认值,DedeCMS 会自行启动 Session)。
- 确保
- 检查目录权限:
- 给 DedeCMS 根目录下的
data文件夹(Session 可能会在这里创建)以及sessions文件夹(如果存在)赋予 755 或 777 的写入权限。 - 在 Linux 服务器上,可以通过 SSH 执行命令:
chmod -R 755 /path/to/your/dede/data
- 给 DedeCMS 根目录下的
GD 库未安装或版本过低
DedeCMS 的验证码是使用 PHP 的 GD 库动态生成的图片,如果服务器没有安装 GD 库,或者版本过低,就无法生成图片。
解决方案:
- 联系你的主机商: 确认服务器是否安装了 GD 库。
- 自行检查: 在你的网站根目录下创建一个
info.php文件,内容为<?php phpinfo(); ?>,然后在浏览器中访问它,在输出结果中搜索 "GD",如果看到 "GD Support" => "enabled",则表示 GD 库已启用。
文件编码问题(乱码)
guestbook.htm 模板文件的编码是 UTF-8,并且保存为了 UTF-8 with BOM 格式,那么输出的 HTML 代码会在最前面多出几个不可见的字符,这会破坏 HTTP 头,导致 Session 和图片无法正确加载,从而显示乱码或空白。
解决方案:
- 使用专业的代码编辑器(如 VS Code, Sublime Text, Notepad++)重新打开
guestbook.htm文件。 - 将文件编码从 UTF-8 with BOM 转换为 UTF-8 (无 BOM) 或 ANSI/GBK(如果你的网站是 GBK 编码)。
- 保存后重新上传到服务器。
文件路径错误
如果修改了网站目录,或者 include/vdimgck.php 文件丢失、路径错误,验证码图片也无法显示。
解决方案:
- 检查文件是否存在: 确认
/include/vdimgck.php文件是否存在于你的服务器上。 - 检查路径: 确保模板中引用的
{dede:global.cfg_cmspath/}变量是正确的,它应该指向你的 DedeCMS 安装根目录。
服务器缓存或浏览器缓存
旧的缓存文件也会导致问题。
解决方案:
- 清除浏览器缓存,或者按
Ctrl + F5强制刷新页面。 - 检查服务器是否开启了全站缓存,如果开启了,尝试清除缓存。
总结排查流程
当遇到验证码问题时,建议按以下顺序进行排查:
- 先看后台:确认【系统基本参数】->【互动设置】里,验证码是否已开启。
- 再查模板:检查
guestbook.htm中是否正确添加了验证码的 HTML 代码。 - 然后看代码:检查
guestbook.php中是否加入了校验逻辑。 - 最后查环境:
- 刷新浏览器,清除缓存。
- 检查文件编码,尤其是
guestbook.htm是否为 UTF-8 with BOM。 - 检查目录权限,确保
data等目录可写。 - 联系主机商,确认 GD 库和 Session 功能是否正常。
按照这个思路,绝大多数 DedeCMS 留言验证码问题都可以得到解决。
