织梦文件archives_do.php存在什么安全风险?

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

这个文件是DedeCMS后台内容发布流程中的一个执行枢纽,它的主要作用是接收并处理从前台内容发布表单(如 article_add.php)提交过来的数据,然后调用相应的函数来完成文章的最终入库、更新、删除等操作。

织梦文件archives_do.php
(图片来源网络,侵删)

archives_do.php“做事”的文件,而像 article_add.php 这样的文件是“准备界面和收集数据”的文件。


文件位置

通常位于织梦CMS后台的根目录下: /dede/archives_do.php


主要功能

archives_do.php 通过一个名为 dopost 的POST参数来判断用户要执行的具体操作,根据 dopost 的不同值,它会执行不同的逻辑。

常见的 dopost 值及其对应的功能:

织梦文件archives_do.php
(图片来源网络,侵删)
dopost 功能描述 涉及的主要函数
save 保存新文章 InsertArticle()
edit 更新已存在的文章 UpDateArt()
delete 删除文章 DelArc()
pub 发布文章(从草稿状态转为已发布) MakeArchives()
check 审核文章 CheckArchives()
saveset 保存文章设置(如栏目属性等) SaveArticleSet()
move 移动文章到其他栏目 MoveArc()
copy 复制文章到其他栏目 CopyArc()
addto 添加到自定义列表 AddArcToCustom()

核心工作流程

无论执行哪种操作,archives_do.php 的工作流程都遵循一个基本模式:

  1. 安全检查与初始化

    • 检查登录状态:首先会检查用户是否已登录,如果未登录则直接拒绝操作。
    • 引入核心文件:引入 config.phpdedesql.class.php(数据库操作类)、inc_archives_functions.php(文章处理函数库)等核心文件。
    • 获取操作类型:从 $_POST$_GET 中获取 dopost 参数,确定要执行的动作。
  2. 接收并处理表单数据

    • 接收从发布页面提交过来的所有数据,包括:
      • typeid: 栏目ID
      • title: 文章标题
      • body: 文章正文
      • description: 文章摘要
      • writer: 作者
      • source: 来源
      • litpic: 缩略图
      • flag: 特性(头条、推荐等)
      • keywords: 关键词
      • templet: 使用的模板
      • 等等...
  3. 调用核心处理函数

    织梦文件archives_do.php
    (图片来源网络,侵删)
    • 根据第一步确定的 dopost 值,调用相应的核心函数。
    • dopost == 'save'
      • 它会调用 InsertArticle() 函数。
      • InsertArticle() 函数内部会进行非常复杂的操作,包括:
        • 数据处理、处理HTML标签、生成摘要等。
        • 生成静态页:根据模板和文章数据,生成HTML文章页面。
        • 更新数据库:向 #@__archives (文章主表) 和 #@__arctiny (文章微表) 中插入新记录。
        • 更新栏目:更新对应栏目的文章数量、最后发布时间等信息。
        • 更新缓存:更新栏目缓存、首页缓存等,以确保前台显示最新数据。
  4. 返回结果

    • 操作完成后,archives_do.php 会根据执行结果,向用户输出一个提示信息。
    • 成功时:通常会跳转到一个页面,并提示“添加成功”、“更新成功”等。
    • 失败时:会提示具体的错误信息,如“标题不能为空”、“栏目选择错误”等。

代码片段解析

下面是一个简化的代码逻辑,帮助你更好地理解其工作原理:

<?php
require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC."/archives.class.php");
require_once(DEDEINC."/dedetemplate.class.php");
// 检查用户是否登录
CheckRank(0, $cuserLogin, $cfg_md5safe);
// 获取操作类型
$dopost = empty($_POST['dopost']) ? '' : $_POST['dopost'];
// 根据不同的操作类型执行不同的逻辑
switch($dopost) {
    case 'save': // 保存新文章
        $arc = new Archives($typeid);
        $arc->Save();
        ShowMsg("成功发布一篇新文章!", "javascript:;");
        exit();
        break;
    case 'edit': // 更新文章
        $arc = new Archives($aid);
        $arc->Edit();
        ShowMsg("成功更新文章!", "javascript:;");
        exit();
        break;
    case 'delete': // 删除文章
        $arc = new Archives($aid);
        $arc->Delete();
        ShowMsg("成功删除文章!", "javascript:;");
        exit();
        break;
    // ... 其他 case,如 'pub', 'check' 等
    default:
        ShowMsg("无效的操作请求!", "javascript:;");
        exit();
        break;
}
// ShowMsg 是一个封装好的提示和跳转函数
function ShowMsg($msg, $gourl, $onlymsg = 0, $limittime = 1000) {
    // ... 显示提示信息的逻辑
}
?>

注意:现代版本的DedeCMS(如V5.7)已经将 archives_do.php 中的很多逻辑封装到了 archives.class.php 这个类文件中,使得 archives_do.php 本身变得更加简洁,主要负责接收请求和调用类的实例。


重要性与修改建议

为什么重要?

  1. 内容发布的入口:所有后台的内容操作都通过它完成,是内容管理系统的“心脏”。
  2. 性能关键点:文章生成、数据库操作都在这里完成,这里的代码效率直接影响网站发布内容的速度。
  3. 安全关键点:它处理用户提交的所有数据,是SQL注入、XSS等攻击的主要防御点。

修改建议(谨慎!)

  1. 不要直接修改:除非你非常了解DedeCMS的底层架构,否则不建议直接修改此文件,错误的修改可能导致无法发布文章、网站崩溃等严重问题。
  2. 二次开发:如果你需要增加新的发布功能(发布时自动调用某个API),可以通过以下两种方式安全地进行:
    • Hook钩子:在 archives_do.phpswitch 语句中,为你新增的 dopost 值添加一个 case,然后调用你自定义的函数。
    • 重写或继承类:如果你熟悉面向对象,可以继承 Archives 类,并重写 Save()Edit() 等方法,然后在 archives_do.php 中实例化你的新类。
  3. 调试:如果遇到发布问题,可以在此文件的关键位置(如 switch 语句前后、核心函数调用前后)添加 var_dump()file_put_contents() 来打印和记录变量信息,以便定位问题。

archives_do.php 是织梦CMS后台内容发布的命令执行中心,它通过 dopost 参数接收指令,调用底层函数来完成文章的增、删、改、查、审、发等一系列复杂操作,理解它的作用和工作原理,对于排查发布问题、进行二次开发以及深入学习DedeCMS的架构都至关重要。

-- 展开阅读全文 --
头像
dede5.7首页标题如何替换为关键词?
« 上一篇 2025-12-03
数据结构(C语言版)清华大学出版社,如何高效学习?
下一篇 » 2025-12-03

相关文章

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

目录[+]