织梦 dede_fieldshash

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

什么是 dede_fieldshash

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

织梦 dede_fieldshash
(图片来源网络,侵删)

它的主要作用是:在表单提交时,对表单中除了特定字段外的所有字段进行一次“签名”或“校验”,防止恶意用户通过修改 HTML 源代码来提交非法数据。

你可以把它想象成一个“数据完整性校验器”。


它的工作原理(核心机制)

理解其工作原理是掌握 dede_fieldshash 的关键。

生成阶段(在服务器端)

当用户访问一个由织梦生成的、包含数据编辑表单的页面时(后台的内容编辑页 article_edit.php),织梦会执行以下步骤:

织梦 dede_fieldshash
(图片来源网络,侵删)
  1. 获取当前模型的所有字段:系统会根据你正在编辑的内容所属的模型(文章模型”),获取这个模型下所有字段的定义。
  2. 收集需要校验的字段名:系统会排除掉一些不需要校验的特殊字段,
    • id: 内容ID,通常由数据库自增,用户不应修改。
    • typeid: 栏目ID,通常通过下拉菜单选择,不应被随意修改。
    • arcrank: 内容状态(如已审核、未审核),通常也有特定控件。
    • dutyuser: 责任编辑。
    • senddate: 发布时间。
    • mid: 会员ID。
    • 以及其他一些系统内部使用的字段。
  3. 生成字段列表字符串:将剩下的所有需要校验的字段名(如 title, body, source, litpic 等)按特定顺序(通常是字母顺序)拼接成一个由逗号分隔的字符串。
    • body,channel,keywords,litpic,redirecturl,source,title
  4. 计算哈希值:使用一个特定的哈希算法(通常是 md5),将上一步生成的字段列表字符串与一个固定的“盐值”(salt)结合,计算出最终的哈希值。
    • 这个“盐值”是硬编码在织梦程序中的,保证了安全性。
    • hash_value = md5("body,channel,keywords,..." . "固定的盐值");
  5. 将哈希值写入表单:系统会将这个计算出的 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>

校验阶段(在服务器端接收数据)

当用户填写完表单并点击“提交”后,服务器会再次执行校验:

  1. 接收表单数据:服务器接收到所有 POST 数据,包括用户修改的 title, body 等内容,以及那个隐藏的 dede_fieldshash
  2. 重新计算哈希值:服务器再次执行一遍生成阶段的第 2、3、4 步
    • 根据当前模型,获取所有需要校验的字段名。
    • 拼接成字符串。
    • 用同样的“盐值”计算出新的哈希值。
  3. 进行比较:将新计算出的哈希值用户提交表单中的 dede_fieldshash进行比较。
    • 如果两者完全一致:说明用户提交的表单字段集合是合法的,没有被恶意增删,系统会继续处理数据,更新数据库。
    • 如果两者不一致:说明表单被篡改了!黑客可能通过浏览器开发者工具增加了一个 malicious_field='hacked' 的字段,织梦会判定此次提交为非法请求,并通常会直接终止执行,不进行任何数据库操作,从而保证了数据的安全。

为什么需要 dede_fieldshash

它的核心目的是防止 CSRF(跨站请求伪造)和表单数据篡改

  • 防止字段篡改:没有 dede_fieldshash,任何能拿到你表单 action 地址的人,都可以构造一个恶意的 POST 请求,向数据库里写入任何你模型里有的字段,甚至通过开发者工具添加你模型里没有的字段(如果你的代码没有严格过滤)。dede_fieldshash 确保了只有“合法”的字集才能被提交。
  • 增加攻击难度:攻击者不仅要猜到 action 地址,还需要知道你的模型结构、字段顺序以及那个隐藏的“盐值”才能成功伪造请求,这极大地提高了攻击门槛。

对二次开发者的影响和注意事项

如果你是二次开发者,了解 dede_fieldshash 至关重要,否则你的修改可能会导致无法保存数据。

添加自定义字段

这是最常见的情况,如果你在后台模型管理中增加了一个新的自定义字段(my_custom_field):

织梦 dede_fieldshash
(图片来源网络,侵删)
  • 无需手动处理:好消息是,如果你只是通过织梦后台正常添加字段,织梦系统会自动将这个新字段纳入 dede_fieldshash 的校验范围,你不需要做任何额外操作,表单就能正常保存。

修改或创建自定义的编辑模板

如果你需要修改 article_edit.htm 这样的编辑模板,或者创建一个全新的自定义表单页面来提交数据到织梦(通过一个外部表单投稿):

  • 必须包含 dede_fieldshash:你的表单中必须包含一个名为 dede_fieldshash 的隐藏输入框。
  • 如何获取正确的值?:你不能自己随便写一个值,正确的做法是:
    1. 调用织梦的API来生成它,通常在 inc/inc_fun_funAdmin.php 文件里有相关的函数,如 GetFieldsHash()
    2. 在你的PHP处理文件中,使用类似下面的代码来获取并传递给模板:
      require_once(DEDEINC.'/inc/inc_fun_funAdmin.php');
      $fields_hash = GetFieldsHash($channelid, $typeid); // $channelid是模型ID
      $fields_hash = md5($fields_hash . $cfg_cookie_encode); // 加上盐值
    3. 然后在你的模板文件中输出:
      <input type="hidden" name="dede_fieldshash" value="<?php echo $fields_hash; ?>">

常见错误:dede_fieldshash 校验失败

如果你在保存内容时遇到问题,并且后台没有报其他明显的SQL或PHP错误,dede_fieldshash 校验失败的可能性非常大。

  • 原因:通常是因为你的表单代码不完整,缺少了这个隐藏字段,或者字段的值在传递过程中被意外修改了。
  • 调试方法
    1. 在你的表单页面的源代码中,搜索 dede_fieldshash,确认它是否存在。
    2. 如果存在,检查它的值是否正确,你可以尝试在不同环境下(如本地和服务器)比较这个值,看是否因为环境差异导致哈希计算不同(虽然不常见,但有可能)。
    3. 检查你的表单是否被 JavaScript 等脚本意外修改过。

特性 描述
本质 一个用于表单数据校验的隐藏字段,值为一个哈希值。
目的 防止恶意用户通过修改HTML源代码来篡改或提交非法字段,保障数据安全。
工作方式 服务器端生成哈希 -> 前端表单携带哈希 -> 服务器端接收并重新计算哈希 -> 比对两个哈希值是否一致
对开发者 后台添加字段:无需手动处理,系统自动搞定。
自定义表单/模板必须手动添加 dede_fieldshash 隐藏字段,并确保其值是通过织梦API正确生成的。
调试问题:遇到无法保存的情况,dede_fieldshash 是首要的排查点。

理解了 dede_fieldshash,你就能更好地理解织梦的数据提交机制,在进行二次开发时也能避免很多“莫名其妙”的保存失败问题。

-- 展开阅读全文 --
头像
织梦dede如何更改templates模板?
« 上一篇 12-07
织梦栏目typeimg字段如何调用图片?
下一篇 » 12-07

相关文章

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

目录[+]