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

(图片来源网络,侵删)
问题根源分析
“非法操作”是一个笼统的提示,其背后的具体原因多种多样,主要集中在以下几个方面:
-
安全防护机制触发 (最常见)
- CSRF 跨站请求伪造防护:织梦为了防止恶意网站利用用户身份提交表单,会在表单中生成一个隐藏的
token值,如果用户提交的表单中缺少这个token,或者token值不正确/已过期,服务器就会判定为非法操作。 - 数据验证失败:织梦会对提交的数据进行一系列安全检查,
- 检测到包含常见的 SQL 注入关键字(如
SELECT,INSERT,DELETE,UNION等)。 - 检测到包含 XSS (跨站脚本) 攻击的代码(如
<script>,javascript:,onerror=等)。 - 提交的数据量超过了系统设定的限制。
- 检测到包含常见的 SQL 注入关键字(如
- CSRF 跨站请求伪造防护:织梦为了防止恶意网站利用用户身份提交表单,会在表单中生成一个隐藏的
-
表单本身的问题
- 表单代码不完整或错误:复制模板时漏掉了
<input type="hidden" name="token" value="{dede:global.token/}" />这行关键的 token 代码。 - 表单调用错误:没有使用织梦的标签
{dede:php}或{dede:include}正确地调用自定义表单的代码,导致表单页面与处理页面分离,token 无法正确传递。 - 表单字段名变更:你在后台修改了自定义表单的字段名,但前台模板文件中的
input标签name属性没有同步修改,导致数据无法正确匹配。
- 表单代码不完整或错误:复制模板时漏掉了
-
服务器环境问题
(图片来源网络,侵删)- PHP 版本不兼容:你使用的 PHP 版本过高,而织梦 CMS(尤其是旧版本)的部分函数在新版 PHP 中已被废弃或禁用,导致执行出错。
- 服务器安全软件拦截:服务器上安装了安全狗、云锁等软件,它们的规则过于严格,将正常的表单提交行为误判为攻击并拦截。
- 文件权限问题:用于接收表单数据的目录(如
/data/)或文件没有写入权限,导致数据保存失败,返回错误。
-
浏览器或缓存问题
- 浏览器缓存:浏览器缓存了旧版本的表单页面,导致提交的
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,字段类型2。name,text;tel,text;content,textarea。dede_fieldshash:一个由系统根据dede_fields生成的哈希值,用于验证字段列表是否被篡改。token:CSRF 防护令牌,必须要有,且值要使用{dede:global.token/}标签动态获取。
解决方案:

(图片来源网络,侵删)
- 如果缺少这三行中的任何一行,请从后台生成表单代码时完整复制过来。
token的值是写死的,请务必修改为{dede:global.token/}。
第二步:清除浏览器缓存和 Cookie
- 按
Ctrl + F5或Ctrl + Shift + R强制刷新页面。 - 或者打开浏览器的“无痕/隐私模式”重新提交表单。
- 如果还不行,尝试清除网站的缓存(如果使用了缓存插件)和浏览器缓存。
第三步:检查织梦后台设置
-
检查自定义表单字段:
- 进入织梦后台 -> 核心 -> 内容模型管理 -> 自定义表单。
- 点击你正在使用的表单,进入“字段管理”。
- 确认前台表单中使用的
name属性值,与后台这里“字段名称”完全一致,包括大小写。
-
检查系统基本参数:
- 进入后台 -> 系统 -> 系统基本参数 -> 核心设置。
- 找到 “自定义表单是否需要审核”,确保设置为“是”或“否”,并确认其状态。
- 检查 “网站关键字”、“网站描述” 等是否包含敏感词,有时过于严苛的过滤规则会误伤。
第四步:检查服务器环境
-
查看 PHP 版本:
- 在后台“系统” -> “系统版本”中可以看到当前 PHP 版本。
- 如果版本过高(如 PHP 7.4+),建议尝试切换到 PHP 7.2 或 7.3,这是织梦最兼容的版本。
-
检查文件权限:
- 通过 FTP 或文件管理器,确保织梦安装目录下的
data文件夹及其子文件夹(如data/safe/)具有 755 权限,用于存储表单数据的文件(通常是.txt或.php)具有 644 权限。
- 通过 FTP 或文件管理器,确保织梦安装目录下的
-
检查安全软件:
如果你的服务器装有安全狗、云锁等,暂时将其“拦截模式”设置为“观察模式”或直接关闭,然后再次尝试提交表单,如果恢复正常,说明是规则拦截,你需要调整该软件的规则,将你的表单提交页面加入白名单。
第五步:临时关闭安全验证(用于调试)
这一步可以帮你快速定位问题,但仅限在本地调试或测试环境使用,生产环境切勿关闭!
- 打开织梦核心文件
/plus/diy.php。 - 找到这一行:
if(!empty($dede_fields)) { $fieldarr = explode(';', $dede_fields); // ... 后续代码 ... } - 在文件最开头,找到
require_once(dirname(__FILE__)."/../include/common.inc.php");这一行。 - 在它后面添加以下代码,可以临时跳过 token 和 hash 验证:
// 调试用:临时跳过 token 和 hash 验证 // $_POST['token'] = 'test'; // $_POST['dede_fieldshash'] = 'test';
- 保存文件后再次提交,如果成功了,100% 是
token或hash的问题,请重点回到第一步检查表单代码。调试完毕后务必删除这段代码!
总结与最佳实践
| 问题现象 | 最可能的原因 | 解决方案 |
|---|---|---|
| 提交后直接跳转到“非法操作”页面 | 缺少 token 或 token 无效 |
检查前台表单代码,确保有 <input name="token" value="{dede:global.token/}" /> |
| 提交后数据没保存,也无提示 | dede_fields 或 dede_fieldshash 不匹配 |
检查后台字段名和前台 input 的 name 是否一致,重新复制后台生成的表单代码。 |
| 换了浏览器或电脑才能提交 | 浏览器缓存/Cookie 问题 | 强制刷新页面 (Ctrl+F5),或在无痕模式下测试。 |
| 服务器迁移后出现此问题 | PHP 版本不兼容 或 文件权限错误 | 切换到 PHP 7.2/7.3 版本,检查 /data 目录权限。 |
| 使用 CDN 后出现问题 | CDN 缓存了动态页面 | 排除表单页面不被 CDN 缓存,或配置 CDN 刷新规则。 |
预防胜于治疗:
- 尽量使用织梦官方提供的最新稳定版。
- 修改默认的后台目录和管理员账号密码。
- 定期更新织梦程序和所用插件。
- 在自定义表单中,对用户输入进行严格的前后端验证,不要完全依赖织梦自带的过滤。
希望这份详细的指南能帮助你成功解决问题!如果以上步骤都无法解决,请提供你的织梦版本号、PHP版本号、以及前台表单代码片段,以便进一步分析。
