什么是 dede_fieldshash?
dede_fieldshash 是一个隐藏的表单字段,它的全称是 "Fields Hash",即“字段哈希”。

(图片来源网络,侵删)
它的主要作用是:在表单提交时,对表单中除了特定字段外的所有字段进行一次“签名”或“校验”,防止恶意用户通过修改 HTML 源代码来提交非法数据。
你可以把它想象成一个“数据完整性校验器”。
它的工作原理(核心机制)
理解其工作原理是掌握 dede_fieldshash 的关键。
生成阶段(在服务器端)
当用户访问一个由织梦生成的、包含数据编辑表单的页面时(后台的内容编辑页 article_edit.php),织梦会执行以下步骤:

(图片来源网络,侵删)
- 获取当前模型的所有字段:系统会根据你正在编辑的内容所属的模型(文章模型”),获取这个模型下所有字段的定义。
- 收集需要校验的字段名:系统会排除掉一些不需要校验的特殊字段,
id: 内容ID,通常由数据库自增,用户不应修改。typeid: 栏目ID,通常通过下拉菜单选择,不应被随意修改。arcrank: 内容状态(如已审核、未审核),通常也有特定控件。dutyuser: 责任编辑。senddate: 发布时间。mid: 会员ID。- 以及其他一些系统内部使用的字段。
- 生成字段列表字符串:将剩下的所有需要校验的字段名(如
title,body,source,litpic等)按特定顺序(通常是字母顺序)拼接成一个由逗号分隔的字符串。body,channel,keywords,litpic,redirecturl,source,title
- 计算哈希值:使用一个特定的哈希算法(通常是
md5),将上一步生成的字段列表字符串与一个固定的“盐值”(salt)结合,计算出最终的哈希值。- 这个“盐值”是硬编码在织梦程序中的,保证了安全性。
hash_value = md5("body,channel,keywords,..." . "固定的盐值");
- 将哈希值写入表单:系统会将这个计算出的
hash_value作为隐藏的dede_fieldshash字段,插入到 HTML 表单中。
<!-- 在后台编辑文章的表单中,你会看到类似这样的代码 -->
<form name="myform" action="article_edit.php" method="post">
<!-- ... 其他表单元素 ... -->
<input type="hidden" name="dede_fieldshash" value="a1b2c3d4e5f6...">
<input type="submit" name="submit" value="保存">
</form>
校验阶段(在服务器端接收数据)
当用户填写完表单并点击“提交”后,服务器会再次执行校验:
- 接收表单数据:服务器接收到所有 POST 数据,包括用户修改的
title,body等内容,以及那个隐藏的dede_fieldshash。 - 重新计算哈希值:服务器再次执行一遍生成阶段的第 2、3、4 步:
- 根据当前模型,获取所有需要校验的字段名。
- 拼接成字符串。
- 用同样的“盐值”计算出新的哈希值。
- 进行比较:将新计算出的哈希值与用户提交表单中的
dede_fieldshash值进行比较。- 如果两者完全一致:说明用户提交的表单字段集合是合法的,没有被恶意增删,系统会继续处理数据,更新数据库。
- 如果两者不一致:说明表单被篡改了!黑客可能通过浏览器开发者工具增加了一个
malicious_field='hacked'的字段,织梦会判定此次提交为非法请求,并通常会直接终止执行,不进行任何数据库操作,从而保证了数据的安全。
为什么需要 dede_fieldshash?
它的核心目的是防止 CSRF(跨站请求伪造)和表单数据篡改。
- 防止字段篡改:没有
dede_fieldshash,任何能拿到你表单action地址的人,都可以构造一个恶意的 POST 请求,向数据库里写入任何你模型里有的字段,甚至通过开发者工具添加你模型里没有的字段(如果你的代码没有严格过滤)。dede_fieldshash确保了只有“合法”的字集才能被提交。 - 增加攻击难度:攻击者不仅要猜到
action地址,还需要知道你的模型结构、字段顺序以及那个隐藏的“盐值”才能成功伪造请求,这极大地提高了攻击门槛。
对二次开发者的影响和注意事项
如果你是二次开发者,了解 dede_fieldshash 至关重要,否则你的修改可能会导致无法保存数据。
添加自定义字段
这是最常见的情况,如果你在后台模型管理中增加了一个新的自定义字段(my_custom_field):

(图片来源网络,侵删)
- 无需手动处理:好消息是,如果你只是通过织梦后台正常添加字段,织梦系统会自动将这个新字段纳入
dede_fieldshash的校验范围,你不需要做任何额外操作,表单就能正常保存。
修改或创建自定义的编辑模板
如果你需要修改 article_edit.htm 这样的编辑模板,或者创建一个全新的自定义表单页面来提交数据到织梦(通过一个外部表单投稿):
- 必须包含
dede_fieldshash:你的表单中必须包含一个名为dede_fieldshash的隐藏输入框。 - 如何获取正确的值?:你不能自己随便写一个值,正确的做法是:
- 调用织梦的API来生成它,通常在
inc/inc_fun_funAdmin.php文件里有相关的函数,如GetFieldsHash()。 - 在你的PHP处理文件中,使用类似下面的代码来获取并传递给模板:
require_once(DEDEINC.'/inc/inc_fun_funAdmin.php'); $fields_hash = GetFieldsHash($channelid, $typeid); // $channelid是模型ID $fields_hash = md5($fields_hash . $cfg_cookie_encode); // 加上盐值
- 然后在你的模板文件中输出:
<input type="hidden" name="dede_fieldshash" value="<?php echo $fields_hash; ?>">
- 调用织梦的API来生成它,通常在
常见错误:dede_fieldshash 校验失败
如果你在保存内容时遇到问题,并且后台没有报其他明显的SQL或PHP错误,dede_fieldshash 校验失败的可能性非常大。
- 原因:通常是因为你的表单代码不完整,缺少了这个隐藏字段,或者字段的值在传递过程中被意外修改了。
- 调试方法:
- 在你的表单页面的源代码中,搜索
dede_fieldshash,确认它是否存在。 - 如果存在,检查它的值是否正确,你可以尝试在不同环境下(如本地和服务器)比较这个值,看是否因为环境差异导致哈希计算不同(虽然不常见,但有可能)。
- 检查你的表单是否被 JavaScript 等脚本意外修改过。
- 在你的表单页面的源代码中,搜索
| 特性 | 描述 |
|---|---|
| 本质 | 一个用于表单数据校验的隐藏字段,值为一个哈希值。 |
| 目的 | 防止恶意用户通过修改HTML源代码来篡改或提交非法字段,保障数据安全。 |
| 工作方式 | 服务器端生成哈希 -> 前端表单携带哈希 -> 服务器端接收并重新计算哈希 -> 比对两个哈希值是否一致。 |
| 对开发者 | 后台添加字段:无需手动处理,系统自动搞定。 自定义表单/模板:必须手动添加 dede_fieldshash 隐藏字段,并确保其值是通过织梦API正确生成的。调试问题:遇到无法保存的情况, dede_fieldshash 是首要的排查点。 |
理解了 dede_fieldshash,你就能更好地理解织梦的数据提交机制,在进行二次开发时也能避免很多“莫名其妙”的保存失败问题。
