使用 DedeCMS 自带的 safe_check 函数(推荐,最简单)
这是 DedeCMS 内置的一个验证机制,专门用于防止恶意提交,它的原理是在表单提交时,检查一个由系统生成的 token 值是否匹配,如果不匹配则视为非法提交。

(图片来源网络,侵删)
优点:
- 无需安装额外的插件。
- 代码量少,集成简单。
- 安全性高,能有效抵御大部分自动化提交。
缺点:
- 验证码是
token形式,不是用户需要手动输入的数字/字母,对普通用户来说不够直观。 - 无法防止“真人”的恶意手动提交。
操作步骤:
第一步:在自定义表单的模板文件中添加隐藏的 Token 字段
打开你用于显示自定义表单的模板文件(templets/plus/post_diyform.htm),在 <form> 标签内部的任意位置,添加以下代码:

(图片来源网络,侵删)
<input type="hidden" name="dede_fields" value="你的字段名1,文本框;你的字段名2,多行文本;" />
<input type="hidden" name="dede_fieldshash" value="{dede:hash md5/}" />
代码解释:
dede_fields: 这个字段的值是固定的格式字段名1,控件类型;字段名2,控件类型;...,这里的“控件类型”只是为了通过验证,可以随意填写,文本框”、“多行文本”等,它不会真正影响你的表单控件。dede_fieldshash: 这是核心!{dede:hash md5/}是 DedeCMS 的一个内置标签,它会根据dede_fields的值和你网站的安全密钥,生成一个唯一的哈希值(MD5),这个哈希值就是我们的“验证码”。
示例:
假设你的自定义表单模板文件内容如下:
<form action="/plus/diy.php" enctype="multipart/form-data" method="post">
<input type="hidden" name="action" value="post" />
<input type="hidden" name="diyid" value="1" /> <!-- 1 是你的自定义表单ID -->
<input type="hidden" name="do" value="2" />
<!-- ====== 在这里添加 Token 验证 ====== -->
<input type="hidden" name="dede_fields" value="name,text;tel,text;content,multitext" />
<input type="hidden" name="dede_fieldshash" value="{dede:hash md5/}" />
<!-- ================================== -->
<div>
<label for="name">姓名:</label>
<input type="text" name="name" id="name" required />
</div>
<div>
<label for="tel">电话:</label>
<input type="text" name="tel" id="tel" required />
</div>
<div>
<label for="content">留言内容:</label>
<textarea name="content" id="content" rows="5" required></textarea>
</div>
<div>
<input type="submit" name="submit" value="提交" />
</div>
</form>
第二步:在后台开启安全检查

(图片来源网络,侵删)
- 登录你的 DedeCMS 后台。
- 进入【系统】-> 【系统基本参数】。
- 在左侧菜单中选择【核心设置】。
- 找到 “安全设置” 部分。
- 将 “是否开启验证码安全检查” 设置为 “是”。
- 点击【保存】。
完成以上两步,你的自定义表单就已经具备了基本的 token 验证功能,任何不包含正确 dede_fieldshash 值的提交都会被系统拒绝。
使用图形验证码(更传统,用户体验更好)
这种方法会生成一个图片,用户需要输入图片上显示的字符才能提交,它对真人用户更友好,也能有效防止自动化攻击。
优点:
- 用户体验好,用户习惯于输入图形验证码。
- 安全性非常高,能有效防止机器人和自动化脚本。
缺点:
- 需要修改 PHP 文件,有一定技术门槛。
- 如果用户无法看清验证码,可能会影响提交。
操作步骤:
第一步:在模板文件中添加验证码输入框
在表单模板文件(如 templets/plus/post_diyform.htm)中,你希望显示验证码的位置,添加以下代码:
<div>
<label for="vdcode">验证码:</label>
<input type="text" name="vdcode" id="vdcode" style="width:50px;text-transform:uppercase;" required />
<img src="/include/vdimgck.php" onclick="this.src='/include/vdimgck.php?'+Math.random();" alt="看不清?点击换一张" style="cursor:pointer;" title="看不清?点击换一张" />
</div>
代码解释:
<input name="vdcode">: 用于接收用户输入的验证码。<img src="/include/vdimgck.php">: 这是 DedeCMS 自带的验证码生成图片。onclick="this.src='...?'+Math.random();": 点击图片时,通过改变 URL 参数来刷新验证码。
第二步:修改 PHP 处理文件以验证码
这是最关键的一步,我们需要找到处理表单提交的 PHP 文件,并在其中加入验证码的校验逻辑。
- 找到文件:打开
/plus/diy.php文件。 - 定位代码:找到
if($dopost == 'post')这段代码块。 - 添加验证:在这段代码块的开头,在
$dede_fields = empty($dede_fields) ? '' : preg_replace('/[^a-z0-9_,;]/', '', $dede_fields);这行代码之前,插入以下验证代码:
// 在 if($dopost == 'post') 内部,开头处添加
// ----------------- 验证码开始 -----------------
if(empty($vdcode) || strtolower($vdcode) != $_SESSION['vdcode'])
{
showMsg('验证码错误!', '-1');
exit();
}
// ----------------- 验证码结束 -----------------
代码解释:
empty($vdcode): 检查用户是否输入了验证码。strtolower($vdcode) != $_SESSION['vdcode']: 将用户输入的验证码(不区分大小写)与服务器端SESSION中存储的正确验证码进行比较。showMsg('验证码错误!', '-1');: 如果验证失败,则提示错误信息并停止脚本执行。
修改后的 if($dopost == 'post') 代码块示例:
if($dopost == 'post')
{
// ----------------- 验证码开始 -----------------
if(empty($vdcode) || strtolower($vdcode) != $_SESSION['vdcode'])
{
showMsg('验证码错误!', '-1');
exit();
}
// ----------------- 验证码结束 -----------------
$dede_fields = empty($dede_fields) ? '' : preg_replace('/[^a-z0-9_,;]/', '', $dede_fields);
$dede_fieldshash = empty($dede_fieldshash) ? '' : preg_replace('/[^0-9a-f]/', '', $dede_fieldshash);
// ... 后面的代码保持不变 ...
}
完成以上步骤后,你的自定义表单就成功加入了图形验证码功能。
总结与建议
| 特性 | 方法一 (Token) | 方法二 (图形验证码) |
|---|---|---|
| 实现难度 | 非常简单 (仅需修改模板) | 较简单 (需修改模板和PHP文件) |
| 用户体验 | 无感,用户无需操作 | 传统,用户需要输入 |
| 安全性 | 高,防自动化提交 | 非常高,防自动化+防部分真人恶意 |
| 推荐场景 | 后台管理、提交频率不高的表单 | 用户注册、留言、投稿等所有对用户开放的表单 |
最终建议:
- 如果只是想做一个简单的防爬虫措施,使用方法一就足够了,它最简单、最安全。
- 如果这是一个面向公众的、重要的表单(如留言、报名、订单),强烈推荐使用方法二,因为它提供了更好的用户体验和更强的安全性。
- 最安全的做法:两种方法同时使用,即既在模板中加入
token验证,也加入图形验证码,这样即使图形验证码被绕过,token验证还能提供第二层保护。
