织梦自定义表单非法操作

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 织梦建站 正文

下面我将从问题原因、排查步骤、解决方案三个方面,为你详细拆解并解决这个问题。

织梦自定义表单非法操作
(图片来源网络,侵删)

问题根源分析

“非法操作”是一个笼统的提示,其背后的具体原因多种多样,主要集中在以下几个方面:

  1. 安全防护机制触发 (最常见)

    • CSRF 跨站请求伪造防护:织梦为了防止恶意网站利用用户身份提交表单,会在表单中生成一个隐藏的 token 值,如果用户提交的表单中缺少这个 token,或者 token 值不正确/已过期,服务器就会判定为非法操作。
    • 数据验证失败:织梦会对提交的数据进行一系列安全检查,
      • 检测到包含常见的 SQL 注入关键字(如 SELECT, INSERT, DELETE, UNION 等)。
      • 检测到包含 XSS (跨站脚本) 攻击的代码(如 <script>, javascript:, onerror= 等)。
      • 提交的数据量超过了系统设定的限制。
  2. 表单本身的问题

    • 表单代码不完整或错误:复制模板时漏掉了 <input type="hidden" name="token" value="{dede:global.token/}" /> 这行关键的 token 代码。
    • 表单调用错误:没有使用织梦的标签 {dede:php}{dede:include} 正确地调用自定义表单的代码,导致表单页面与处理页面分离,token 无法正确传递。
    • 表单字段名变更:你在后台修改了自定义表单的字段名,但前台模板文件中的 input 标签 name 属性没有同步修改,导致数据无法正确匹配。
  3. 服务器环境问题

    织梦自定义表单非法操作
    (图片来源网络,侵删)
    • PHP 版本不兼容:你使用的 PHP 版本过高,而织梦 CMS(尤其是旧版本)的部分函数在新版 PHP 中已被废弃或禁用,导致执行出错。
    • 服务器安全软件拦截:服务器上安装了安全狗、云锁等软件,它们的规则过于严格,将正常的表单提交行为误判为攻击并拦截。
    • 文件权限问题:用于接收表单数据的目录(如 /data/)或文件没有写入权限,导致数据保存失败,返回错误。
  4. 浏览器或缓存问题

    • 浏览器缓存:浏览器缓存了旧版本的表单页面,导致提交的 token 是无效的旧 token。
    • Cookie 禁用token 的验证有时依赖于 Cookie,如果用户浏览器禁用了 Cookie,可能会导致验证失败。

排查与解决步骤(从易到难)

请按照以下步骤逐一排查,大概率能找到问题所在。

第一步:检查前台表单代码(最关键)

这是最常见的原因,请打开你使用自定义表单的前台模板文件(通常是 .htm 文件),找到表单 <form> 标签内部,确认是否包含以下两行代码:

<input type="hidden" name="dede_fields" value="你的字段名,文本内容" />
<input type="hidden" name="dede_fieldshash" value="你的hash值" />
<input type="hidden" name="token" value="{dede:global.token/}" />
  • dede_fields:定义了表单提交的字段,格式为 字段名1,字段类型1;字段名2,字段类型2name,text;tel,text;content,textarea
  • dede_fieldshash:一个由系统根据 dede_fields 生成的哈希值,用于验证字段列表是否被篡改。
  • token:CSRF 防护令牌,必须要有,且值要使用 {dede:global.token/} 标签动态获取。

解决方案

织梦自定义表单非法操作
(图片来源网络,侵删)
  • 如果缺少这三行中的任何一行,请从后台生成表单代码时完整复制过来。
  • token 的值是写死的,请务必修改为 {dede:global.token/}

第二步:清除浏览器缓存和 Cookie

  1. Ctrl + F5Ctrl + Shift + R 强制刷新页面。
  2. 或者打开浏览器的“无痕/隐私模式”重新提交表单。
  3. 如果还不行,尝试清除网站的缓存(如果使用了缓存插件)和浏览器缓存。

第三步:检查织梦后台设置

  1. 检查自定义表单字段

    • 进入织梦后台 -> 核心 -> 内容模型管理 -> 自定义表单
    • 点击你正在使用的表单,进入“字段管理”。
    • 确认前台表单中使用的 name 属性值,与后台这里“字段名称”完全一致,包括大小写。
  2. 检查系统基本参数

    • 进入后台 -> 系统 -> 系统基本参数 -> 核心设置
    • 找到 “自定义表单是否需要审核”,确保设置为“是”或“否”,并确认其状态。
    • 检查 “网站关键字”“网站描述” 等是否包含敏感词,有时过于严苛的过滤规则会误伤。

第四步:检查服务器环境

  1. 查看 PHP 版本

    • 在后台“系统” -> “系统版本”中可以看到当前 PHP 版本。
    • 如果版本过高(如 PHP 7.4+),建议尝试切换到 PHP 7.2 或 7.3,这是织梦最兼容的版本。
  2. 检查文件权限

    • 通过 FTP 或文件管理器,确保织梦安装目录下的 data 文件夹及其子文件夹(如 data/safe/)具有 755 权限,用于存储表单数据的文件(通常是 .txt.php)具有 644 权限。
  3. 检查安全软件

    如果你的服务器装有安全狗、云锁等,暂时将其“拦截模式”设置为“观察模式”或直接关闭,然后再次尝试提交表单,如果恢复正常,说明是规则拦截,你需要调整该软件的规则,将你的表单提交页面加入白名单。

第五步:临时关闭安全验证(用于调试)

这一步可以帮你快速定位问题,但仅限在本地调试或测试环境使用,生产环境切勿关闭!

  1. 打开织梦核心文件 /plus/diy.php
  2. 找到这一行:
    if(!empty($dede_fields))
    {
        $fieldarr = explode(';', $dede_fields);
        // ... 后续代码 ...
    }
  3. 在文件最开头,找到 require_once(dirname(__FILE__)."/../include/common.inc.php"); 这一行。
  4. 在它后面添加以下代码,可以临时跳过 token 和 hash 验证:
    // 调试用:临时跳过 token 和 hash 验证
    // $_POST['token'] = 'test';
    // $_POST['dede_fieldshash'] = 'test';
  5. 保存文件后再次提交,如果成功了,100% 是 tokenhash 的问题,请重点回到第一步检查表单代码。调试完毕后务必删除这段代码!

总结与最佳实践

问题现象 最可能的原因 解决方案
提交后直接跳转到“非法操作”页面 缺少 tokentoken 无效 检查前台表单代码,确保有 <input name="token" value="{dede:global.token/}" />
提交后数据没保存,也无提示 dede_fieldsdede_fieldshash 不匹配 检查后台字段名和前台 inputname 是否一致,重新复制后台生成的表单代码。
换了浏览器或电脑才能提交 浏览器缓存/Cookie 问题 强制刷新页面 (Ctrl+F5),或在无痕模式下测试。
服务器迁移后出现此问题 PHP 版本不兼容文件权限错误 切换到 PHP 7.2/7.3 版本,检查 /data 目录权限。
使用 CDN 后出现问题 CDN 缓存了动态页面 排除表单页面不被 CDN 缓存,或配置 CDN 刷新规则。

预防胜于治疗

  • 尽量使用织梦官方提供的最新稳定版。
  • 修改默认的后台目录和管理员账号密码。
  • 定期更新织梦程序和所用插件。
  • 在自定义表单中,对用户输入进行严格的前后端验证,不要完全依赖织梦自带的过滤。

希望这份详细的指南能帮助你成功解决问题!如果以上步骤都无法解决,请提供你的织梦版本号、PHP版本号、以及前台表单代码片段,以便进一步分析。

-- 展开阅读全文 --
头像
算法与数据结构c语言描述源代码
« 上一篇 01-06
C语言编译器课程设计,如何实现核心编译原理?
下一篇 » 01-06

相关文章

取消
微信二维码
支付宝二维码

目录[+]