文件位置与作用
filter.inc.php 文件通常位于 DedeCMS 的根目录下,或者在 /include/ 目录中(不同版本路径可能略有差异)。

(图片来源网络,侵删)
核心作用:
- 全局安全过滤:在用户请求(GET, POST, COOKIE)到达业务逻辑之前,先进行一次统一的、强制性的安全检查和过滤。
- 防止 SQL 注入:检测并处理可能包含恶意 SQL 代码的参数。
- 防止 XSS 攻击:过滤掉可能导致跨站脚本执行的恶意代码。
- 统一入口控制:确保所有页面请求都经过这个安全关卡,防止直接访问未授权的脚本文件。
文件结构解析
filter.inc.php 的结构通常包含以下几个部分:
- 安全开关配置:定义哪些安全功能是开启的。
- 全局变量获取与初始化:安全地获取
$_GET,$_POST,$_COOKIE等超全局变量。 - 核心过滤函数:实现具体的过滤逻辑,如
CheckSql()和FilterXSS()。 - 执行过滤:遍历所有请求参数,并调用核心过滤函数进行处理。
- 特殊变量处理:对一些需要保留原始数据的特殊变量进行单独处理。
核心代码详解
下面我们结合一个典型的 filter.inc.php 文件内容,逐块进行解析。
1 安全开关配置
// 是否开启请求过滤
define('FILTEROPEN', true);
// 是否过滤 GET 请求
define('FILTERGET', true);
// 是否过滤 POST 请求
define('FILTERPOST', true);
// 是否过滤 COOKIE 请求
define('FILTERCOOKIE', true);
// 是否开启防刷新 (防止恶意刷新页面)
define('FILTERREFRESH', true);
FILTEROPEN: 总开关,如果设置为false,整个文件将失去作用,强烈建议保持开启。FILTERGET,FILTERPOST,FILTERCOOKIE: 分别控制是否对GET,POST,COOKIE数据进行过滤,可以根据需要调整,但通常全部开启是最佳实践。
2 全局变量获取与初始化
这部分代码是防止全局变量覆盖攻击(如 register_globals=on 的旧环境)的关键。

(图片来源网络,侵删)
// 初始化 GET 变量
if (FILTERGET && $_GET) {
foreach ($_GET as $key => $value) {
// ... 过滤逻辑 ...
}
}
// 同理处理 $_POST 和 $_COOKIE
它会遍历 $_GET, $_POST, $_COOKIE 数组,对每一个值进行过滤,然后将过滤后的值重新赋给这些超全局变量,这样,后续的代码处理的就是“干净”的数据。
3 核心过滤函数
这是 filter.inc.php 的灵魂所在。
CheckSql() - 防止 SQL 注入
function CheckSql($db_string, $querytype = 'select') {
// ... 一些正则表达式和逻辑 ...
// 检测常见的 SQL 关键字和特殊字符
if (eregi("union.*select.*({$db_config['dbprefix']}.*)", $db_string)) {
// 如果检测到 UNION SELECT,则记录日志并中断程序
ShowMsg('SQL 注入尝试!', 'javascript:;');
exit();
}
// ... 其他检测规则 ...
}
- 功能:这个函数会检查传入的 SQL 查询语句(通常是
$db_string)中是否包含恶意模式。 - :
UNION SELECT:典型的联合查询注入。SELECT ... FROM:可能的数据窃取尝试。INSERT,UPDATE,DELETE:可能的数据篡改或删除尝试。DROP,TRUNCATE:危险的表结构操作。or 1=1,and 1=1:布尔盲注。
- 处理方式:一旦检测到恶意模式,通常会调用
ShowMsg()函数显示一个警告信息(“SQL 注入尝试!”),并使用exit()终止脚本执行,防止攻击成功。
FilterXSS() - 防止 XSS 攻击
function FilterXSS($str) {
// 使用 PHP 内置的 htmlspecialchars 函数
$str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// ... 可能还有其他自定义的过滤规则 ...
return $str;
}
- 功能:过滤掉字符串中可能导致浏览器执行恶意脚本的特殊字符。
- 核心机制:
htmlspecialchars(): 这是 PHP 中防止 XSS 最重要、最基础的函数,它会将以下字符转换为 HTML 实体:&->&- ->
" - ->
' <-><>->>
- 转换后,浏览器会把这些字符当作普通文本显示,而不是 HTML 标签或 JavaScript 代码,从而有效防止脚本执行。
- 其他规则:除了
htmlspecialchars,还可能包含过滤<script>,<iframe>,onerror=等危险标签或事件属性的规则。
4 执行过滤
这部分代码将上述函数应用到所有用户输入上。
// 过滤 GET 参数
if (FILTERGET) {
foreach ($_GET as $key => $value) {
if (is_array($value)) {
// 处理数组形式的参数
foreach ($value as $k => $v) {
$_GET[$key][$k] = FilterXSS($v);
}
} else {
$_GET[$key] = FilterXSS($value);
}
}
}
// ... 同样处理 $_POST 和 $_COOKIE ...
5 特殊变量处理
有些变量需要保持原始数据,例如在后台管理中需要输入 HTML 代码。filter.inc.php 通常会提供一个“白名单”机制。

(图片来源网络,侵删)
// 假设 $filter_allow 是一个允许保留原始数据的变量名数组
$filter_allow = array('dopost', 'id', 'typeid', 'channelid', 'page');
// 在过滤循环中,如果变量名在白名单里,则跳过过滤
if (in_array($key, $filter_allow)) {
// 不进行过滤
} else {
// 进行过滤
}
总结与最佳实践
filter.inc.php 的优点
- 集中式管理:将所有安全逻辑集中在一个文件中,便于维护和升级。
- 预防性:在攻击发生前就进行拦截,是第一道防线。
- 全局性:对所有用户输入都有效,保护范围广。
局限性
- 可能过于严格:一些合法的、包含特殊字符的输入(如用户昵称
test&test)也可能被误判或过滤掉,导致功能异常。 - 无法防御所有攻击:它主要针对已知的注入和 XSS 模式,对于逻辑漏洞、CSRF 等攻击无效。
- 性能开销:对每一个请求参数进行正则匹配和字符串处理,会给服务器带来轻微的性能损耗(但在现代服务器上通常可以忽略不计)。
最佳实践
- 务必开启:在生产环境中,绝对不要关闭
FILTEROPEN。 - 不要轻易修改:除非你非常清楚自己在做什么,否则不要随意修改核心过滤函数,错误的修改会留下安全漏洞。
- 结合其他安全措施:
filter.inc.php只是 DedeCMS 安全体系的一部分,你还应该:- 保持 DedeCMS 版本最新:官方会不断修复新发现的安全漏洞。
- 使用强密码:后台管理员密码要足够复杂。
- 修改默认后台目录:将
/dede/改成一个不容易猜到的名字。 - 配置服务器安全:如使用 Web 应用防火墙、设置正确的文件权限等。
- 定期备份数据:以防万一被攻击,可以快速恢复。
filter.inc.php 是 DedeCMS 不可或缺的核心安全组件,理解它的工作原理,有助于我们更好地管理和维护 DedeCMS 网站的安全。
