dede自定义表单如何加入验证码?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 DEDE建站 正文

使用 DedeCMS 自带的 safe_check 函数(推荐,最简单)

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

dede自定义表单加入验证码
(图片来源网络,侵删)

优点:

  • 无需安装额外的插件。
  • 代码量少,集成简单。
  • 安全性高,能有效抵御大部分自动化提交。

缺点:

  • 验证码是 token 形式,不是用户需要手动输入的数字/字母,对普通用户来说不够直观。
  • 无法防止“真人”的恶意手动提交。

操作步骤:

第一步:在自定义表单的模板文件中添加隐藏的 Token 字段

打开你用于显示自定义表单的模板文件(templets/plus/post_diyform.htm),在 <form> 标签内部的任意位置,添加以下代码:

dede自定义表单加入验证码
(图片来源网络,侵删)
<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>

第二步:在后台开启安全检查

dede自定义表单加入验证码
(图片来源网络,侵删)
  1. 登录你的 DedeCMS 后台。
  2. 进入【系统】-> 【系统基本参数】。
  3. 在左侧菜单中选择【核心设置】。
  4. 找到 “安全设置” 部分。
  5. “是否开启验证码安全检查” 设置为 “是”。
  6. 点击【保存】。

完成以上两步,你的自定义表单就已经具备了基本的 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 文件,并在其中加入验证码的校验逻辑。

  1. 找到文件:打开 /plus/diy.php 文件。
  2. 定位代码:找到 if($dopost == 'post') 这段代码块。
  3. 添加验证:在这段代码块的开头,在 $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 验证还能提供第二层保护。
-- 展开阅读全文 --
头像
dede如何调用指定单日文章列表?
« 上一篇 01-11
织梦漂浮广告浏览器兼容问题怎么解决?
下一篇 » 01-11
取消
微信二维码
支付宝二维码

目录[+]