织梦 common.inc.php 如何安全配置防注入?

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

这个文件是整个织梦系统的核心配置文件和初始化文件,你可以把它理解为织梦网站的“总控制中心”或“启动器”,在任何一个织梦页面被加载之前,这个文件几乎总是最先被执行的。

织梦 common.inc.php
(图片来源网络,侵删)

文件位置与作用

文件位置: /include/common.inc.php

核心作用:

  1. 系统启动: 它是整个织梦CMS的入口文件,负责加载和初始化系统运行所需的基本环境。
  2. 配置加载: 它加载并定义了网站的全局配置变量(如网站名称、数据库信息等)。
  3. 安全防护: 它包含了许多核心的安全检查和过滤机制,是网站安全的第一道防线。
  4. 常量定义: 它定义了系统中常用的路径、目录等常量,方便其他文件调用。
  5. 函数库引入: 它引入了系统最核心的函数库文件。

你修改织梦网站的大部分后台设置,最终都会体现在这个文件或由它加载的配置文件中。


文件代码结构与详解

下面我们分块解析 common.inc.php 的代码,并解释每一部分的作用。

织梦 common.inc.php
(图片来源网络,侵删)

安全验证与防直接访问

if(!file_exists(dirname(__FILE__).'/config.php')) {
    header('HTTP/1.1 404 Not Found');
    header('Status: 404 Not Found');
    exit();
}
if(!defined('DEDEREG')) define('DEDEREG', 1);
require_once(dirname(__FILE__).'/config.php');
  • if(!file_exists(...)):首先检查核心配置文件 config.php 是否存在,如果不存在(比如是新安装或文件丢失),则直接返回404错误并退出,这是一个非常关键的保护措施,防止系统在没有配置的情况下运行。
  • if(!defined('DEDEREG')) define('DEDEREG', 1);:定义一个名为 DEDEREG 的常量,并赋值为1,这个常量就像一个“通行证”,表明这个文件是通过合法途径(被 index.php 或其他入口文件)调用的,而不是被恶意直接访问,在其他文件中,经常会先检查这个常量是否存在,如果不存在则拒绝执行。
  • require_once(...):加载并执行 /include/config.php 文件。config.php 存储了数据库连接信息、网站管理员邮箱、网站路径等最敏感的配置。

安全检查与错误报告设置

if (version_compare(PHP_VERSION, '5.6.0', '<')) {
    exit('DedeCMS requires PHP 5.6.0 or higher.');
}
// 错误报告设置
error_reporting(E_ALL ^ E_NOTICE);
  • version_compare(...):检查当前PHP版本是否低于5.6.0,如果是,则直接退出并提示,确保系统在兼容的PHP环境下运行。
  • error_reporting(...):设置PHP的错误报告级别。E_ALL ^ E_NOTICE 的意思是报告所有级别的错误,但是不报告 E_NOTICE( Notice)级别的错误Notice 通常是代码中的小问题(如使用未定义的变量),在开发阶段可能有用,但在生产环境中会产生大量无用的日志,因此通常被屏蔽。

定义核心全局变量

$cfg_cmspath = '/'; // 网站CMS安装目录
$cfg_mainsite = 'http://www.yoursite.com'; // 网站主域名
$cfg_multi_site = 'N'; // 是否开启多站点
// ... 还有许多其他从config.php加载过来的全局变量,如 $cfg_dbhost, $cfg_dbuser 等

这些变量是从 config.php 中加载过来的,它们定义了网站的基本信息,如数据库地址、用户名、密码、网站路径、网站名称等,这些变量在后续的整个网站运行过程中被频繁使用。

定义系统路径常量

这是 common.inc.php 的另一个核心功能,它定义了一系列常量来指向系统的各个目录,方便在代码中引用,避免写死路径。

define('DEDEROOT', __DIR__); // 定义根目录,如 /var/www/html/include
define('DEDEDATA', DEDEROOT . '/data'); // 数据目录,存放缓存、配置等
define('DEDEMEMBER', DEDEROOT . '/member'); // 会员中心目录
define('DEDEINC', DEDEROOT . '/inc'); // 函数库目录
define('DEDETEMPLATE', DEDEROOT . '/templets'); // 模板目录
// ... 等等

使用常量的好处是:

  • 可维护性:如果将来需要移动网站目录,只需修改这些常量的定义即可,而不需要改动成千上万的文件。
  • 可读性:代码中看到 DEDEDATA,就能立刻明白它指向数据目录。

核心函数库的引入

require_once(DEDEINC.'/dedetemplate.class.php');
require_once(DEDEINC.'/connect.php');
require_once(DEDEINC.'/inc_fun_funAdmin.php');
require_once(DEDEINC.'/inc_typelink.php');
require_once(DEDEINC.'/inc_archives_view.php');
// ... 引入更多核心类和函数文件

这里加载了织梦最核心的功能模块,

织梦 common.inc.php
(图片来源网络,侵删)
  • dedetemplate.class.php:模板引擎类,负责解析和加载模板文件。
  • connect.php:数据库连接和操作的核心函数。
  • inc_fun_funAdmin.php:后台常用函数库。
  • inc_typelink.php:栏目链接处理函数。
  • inc_archives_view.php页(文章模型)视图处理的核心文件。

数据库连接与字符集设置

// 检查并执行数据库连接
if(empty($dsql) || !is_object($dsql)) {
    require_once(DEDEINC.'/dedesql.class.php');
    $dsql = new Dedesql(false);
}
// 设置数据库连接字符集
$dsql->SetQuery("SET NAMES 'utf8'");
$dsql->Execute();
  • 这里会检查全局变量 $dsql(数据库连接对象)是否存在,如果不存在,则创建一个新的数据库连接对象,这是单例模式的一种简单应用,确保整个网站只使用一个数据库连接,提高效率。
  • SET NAMES 'utf8':设置数据库连接的字符集为 utf8,确保PHP程序与数据库之间通信时使用统一的编码,避免乱码。

全局安全过滤

这是网站安全的关键部分,common.inc.php 会引入一个专门的安全过滤文件。

require_once(DEDEINC.'/safety_filter.php');

safety_filter.php 文件通常会做以下几件事:

  • 全局变量过滤:对 $_GET, $_POST, $_COOKIE 等超级全局数组进行遍历和过滤,防止SQL注入、XSS跨站脚本等攻击。
  • 敏感函数禁用:可能会禁用一些危险的PHP函数(如 eval, assert 等)。
  • 请求来源检查:检查请求是否来自本站,防止CSRF攻击。

常见问题与修改建议

如何修改网站基本信息?

  • 数据库信息:修改 /include/config.php 文件中的 $cfg_dbhost, $cfg_dbuser, $cfg_dbpwd, $cfg_dbname
  • 网站名称、版权信息等:登录织梦后台,在“系统” -> “系统基本参数”中修改,这些参数会被写入 data/config.cache.inc.php 文件中,common.inc.php 在运行时会优先加载这个缓存文件。

出现 "Include/config.php does not exist!" 错误?

  • 原因/include/config.php 文件丢失或不存在。
  • 解决方法
    1. 如果是新网站,请先运行 /install/index.php 完成安装。
    2. 如果是旧网站,请从织梦官方程序包中找到 config.php.sample 文件,重命名为 config.php,然后根据你的数据库信息修改其内容。

如何提高网站安全性?

  • 文件权限:确保 common.inc.phpconfig.php 的文件权限设置为 644(所有者可读写,组和其他用户只读),目录权限设置为 755
  • 定期更新:关注织梦官方的更新日志,及时打上安全补丁。
  • 修改后台目录:不要使用默认的 /dede/ 作为后台目录,可以自定义一个复杂的名称。
  • 检查代码:不要使用来路不明的插件或模板,它们可能被植入恶意代码。

common.inc.php 是织梦CMS的基石,理解了它的作用和工作原理,你就理解了织梦系统是如何启动和运作的,对于任何想要深入学习织梦开发或者进行二次定制的人来说,仔细研究这个文件是必不可少的第一步,它定义了规则,加载了资源,并守卫着网站的大门。

-- 展开阅读全文 --
头像
dede封面、列表、文章模板有何区别?
« 上一篇 今天
dede模板执行php时,sql如何安全高效运行?
下一篇 » 今天

相关文章

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

目录[+]