dede common.inc.php包含漏洞如何防范?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 DEDE建站 正文

common.inc.php 是 DedeCMS 的 公共配置和初始化文件,它的主要作用是:

dede common.inc.php 包含
(图片来源网络,侵删)
  1. 加载核心配置:读取 data/common.inc.php 中的数据库连接信息和网站基本设置。
  2. 定义全局常量:设置网站根目录、CMS根目录、安装状态等关键常量。
  3. 初始化环境:包含并执行其他核心类库和函数,为整个系统运行准备好必要的环境。
  4. 安全检查:进行一些基本的安全验证,防止非法访问。

任何一个 DedeCMS 页面,只要需要调用系统功能(如数据库查询、使用标签等),几乎都必须首先包含这个文件,它是整个 DedeCMS 应用的“启动器”和“基石”。


文件路径

这个文件位于 DedeCMS 安装目录的根下:

你的网站根目录/
├── dede/
│   ├── common.inc.php  <-- 我们要分析的主角
│   └── ...
├── data/
│   └── common.inc.php  <-- 存储数据库等敏感配置的文件
│   └── ...
├── templets/
├── uploads/
└── ...

文件代码结构与功能详解

下面我们一步步解析 common.inc.php 的典型代码结构和其功能。

安全检查与路径定义

文件的开头部分通常是一些安全检查和定义当前文件路径的代码。

dede common.inc.php 包含
(图片来源网络,侵删)
<?php
//防止恶意调用
if(!defined('DEDERPATH'))
{
    exit("Request Error!");
}
// 定义本文件所在目录
define('DEDEINC', DEDERPATH . '/dede');
  • if(!defined('DEDERPATH')):这是一个非常经典的安全机制,它检查一个名为 DEDERPATH 的常量是否已经被定义,如果这个常量没有被定义,说明这个文件可能是被直接从外部访问的,而不是通过正常的入口文件(如 index.php)加载的,脚本会退出并提示 "Request Error!",从而防止核心配置文件被非法读取。
  • define('DEDEINC', DEDERPATH . '/dede');:定义一个常量 DEDEINC,其值为 DedeCMS 核心 include 文件夹的绝对路径,这个常量在后续包含其他核心文件时会被频繁使用。

加载核心配置文件

这是 common.inc.php 最核心的功能之一——加载网站的数据库连接信息。

//加载系统配置文件
require_once(DEDERPATH.'/data/common.inc.php');
  • require_once()require 表示“必须包含”,如果文件不存在或包含失败,会导致脚本致命错误并停止。_once 表示“只包含一次”,避免重复包含导致的问题。
  • DEDERPATH.'/data/common.inc.php':这里引入了真正的配置文件,这个文件通常是在 DedeCMS 安装过程中自动生成的,里面包含了你的数据库主机名、用户名、密码、数据库名等敏感信息。出于安全考虑,这个文件不应该被直接访问,通常它的权限会被设置为 606 或 640。

包含核心类库和函数文件

在加载完基本配置后,common.inc.php 会依次引入其他几个核心文件,这些文件构成了 DedeCMS 的运行基础。

//加载公共函数库
require_once(DEDEINC.'/arc.partview.class.php');
require_once(DEDEINC.'/arc.archives.class.php');
require_once(DEDEINC.'/arc.spec.class.php');
require_once(DEDEINC.'/arc.sgpage.class.php');
require_once(DEDEINC.'/inc_fun_funAdmin.php');
require_once(DEDEINC.'/inc/inc_fun_fun.php');
require_once(DEDEINC.'/inc/inc_catalog_options.php');
require_once(DEDEINC.'/inc/inc_functions.php');
require_once(DEDEINC.'/inc/inc_typelink.php');
require_once(DEDEINC.'/inc/inc_batchup.php');
require_once(DEDEINC.'/inc/inc_medias.php');
require_once(DEDEINC.'/inc/inc_photograph.php');
require_once(DEDEINC.'/inc/inc_seccode.php');
require_once(DEDEINC.'/inc/inc_spaceone.php');
require_once(DEDEINC.'/inc/inc_unit_functions.php');
require_once(DEDEINC.'/memberlogin.class.php');
require_once(DEDEINC '/splocks.php');
require_once(DEDERPATH.'/data/config.cache.inc.php');
  • *`arc..class.php**:这些是 DedeCMS 的“动作类”(Action Class),负责处理各种核心业务逻辑,如文章的生成、列表的生成、专题页的生成等。arc.archives.class.php` 就专门用于处理单篇文章的生成逻辑。
  • *`inc_.php**:这些是“函数库”(Function Library),包含各种辅助函数,如字符串处理、时间格式化、栏目操作、缓存管理等。inc_functions.php` 就包含了许多通用的工具函数。
  • memberlogin.class.php:会员登录相关的核心类。
  • config.cache.inc.php:这是网站的全局配置缓存文件,它将后台的“系统基本参数”等信息缓存起来,以提高页面加载速度,减少数据库查询。

初始化全局对象和变量

在包含完所有必要文件后,通常会初始化一些全局对象,以便在整个系统中方便地使用。

// 初始化数据库连接
if(empty($dsql))
{
    require_once(DEDEINC.'/dedesql.class.php.php');
    $dsql = new Dedesql(false);
}
// 初始化用户登录对象
if(empty($cuserLogin))
{
    require_once(DEDEINC.'/memberlogin.class.php');
    $cuserLogin = new MemberLogin();
}
  • $dsql 对象:这是 DedeCMS 的数据库操作对象,通过 $dsql,你可以在任何页面执行 SQL 查询,如 $dsql->GetOne("SELECT * FROM#@archives,`#@是 DedeCMS 的表前缀替换符,会自动替换为你安装时设置的表前缀(如dede_`)。
  • $cuserLogin 对象:这个对象用于获取当前登录会员的信息,例如检查用户是否登录、获取用户名、用户ID等。

如何使用 common.inc.php

在自己的自定义页面或开发中,如果你想使用 DedeCMS 的功能(比如查询数据库、调用系统标签),你只需要在文件开头包含它即可。

dede common.inc.php 包含
(图片来源网络,侵删)

示例:创建一个自定义页面 my_test.php

<?php
/*
 * 引入 DedeCMS 核心文件
 * 假设你的 DedeCMS 安装在网站根目录的 'dede' 文件夹中
 */
require_once('dede/common.inc.php');
// 你可以使用 DedeCMS 的全局对象和函数了
// 1. 使用数据库对象 $dsql 查询一条数据
$row = $dsql->GetOne("SELECT id, title FROM `#@__archives` ORDER BY id DESC LIMIT 1");
if(is_array($row))
{
    echo "最新文章的ID是: " . $row['id'] . "<br>";
    echo "最新文章的标题是: " . $row['title'] . "<br>";
}
// 2. 使用系统函数 GetCpuTime() 获取服务器CPU信息(如果该函数存在)
// echo "服务器CPU信息: " . GetCpuTime();
// 3. 使用 $cuserLogin 检查会员是否登录
if($cuserLogin->GetMemberType() > 0)
{
    echo "欢迎, " . $cuserLogin->getUserName() . "!";
}
else
{
    echo "您尚未登录或登录已过期。";
}
?>

注意:在使用 require_once('dede/common.inc.php'); 时,请确保路径是相对于当前脚本文件的正确路径。


安全注意事项

  1. 文件权限data/common.inc.php 文件存储了数据库密码,必须确保其权限设置正确(通常是 606640),禁止其他用户读取。
  2. 防止直接访问common.inc.php 自身也通过检查 DEDERPATH 常量来防止直接访问,但在某些服务器配置下,仍可能被解析,确保 data 目录和 common.inc.php 文件本身有严格的访问控制至关重要。
  3. 路径安全:在包含此文件时,请始终使用服务器绝对路径或相对于网站根目录的路径,避免使用 这样的相对路径,以防路径遍历攻击。

dede/common.inc.php 是 DedeCMS 的“心脏”,它通过加载配置、引入核心库、初始化全局对象,为整个 CMS 的运行奠定了坚实的基础,理解这个文件的作用和工作原理,对于二次开发、排查问题以及提升对 DedeCMS 整体架构的认识

-- 展开阅读全文 --
头像
织梦DedeCMS如何添加图集模型选项?
« 上一篇 11-26
c语言程序总是从main函数开始执行
下一篇 » 11-26

相关文章

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

目录[+]