"这篇文章主要对PHPCMS的代码进行了深入的分析,对于那些希望进行二次开发PHPCMS的开发者来说非常有帮助。作者通过解析关键代码段,解释了PHPCMS的一些核心机制和最佳实践,旨在提高开发者的理解和安全性意识。"
在分析中,我们首先看到的是`include/common.inc.php`文件,它是PHPCMS的核心初始化文件。在这个文件中,作者`逆雪寒`介绍了几个关键的编程技巧和安全措施。
1. 计算脚本开始运行的时间:
`$mtime=explode('',microtime());` 和 `$phpcms_starttime=$mtime[1]+$mtime[0];` 这段代码用于记录脚本的开始时间,这是性能分析的常见做法。在程序执行结束时,可以通过比较开始和结束时间来计算脚本的运行耗时。
2. 清理全局变量:
`unset()` 函数被用来清除如 `$HTTP_ENV_VARS`, `$HTTP_POST_VARS` 等过时的全局变量。这是为了兼容PHP 4.1.0及更高版本,因为这些变量已经被`$_REQUEST`, `$_POST`, `$_GET`等超全局变量所取代。同时,这也是一种缓解变量注入攻击的安全措施,因为未被清理的全局变量可能会导致意外的数据污染。
3. 关闭magic quotes:
`set_magic_quotes_runtime(0);` 这行代码用于关闭PHP的Magic Quotes特性。Magic Quotes在早期的PHP版本中用于自动转义特殊字符,但在现代PHP开发中,由于其性能开销和不推荐的使用方式,通常会关闭它。关闭Magic Quotes可以提升程序性能,并避免因自动转义导致的问题。
4. 定义入口标记:
`define('IN_PHPCMS', TRUE);` 这是PHPCMS的程序入口标记,用于确保所有操作都是从合法的入口点开始,防止非法的远程文件包含(RFI)攻击。如果其他文件中检查到`IN_PHPCMS`未定义或为`FALSE`,则可能表明存在安全风险。
5. 获取程序根目录:
`define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));` 这行代码动态地获取PHPCMS的安装目录,并将其定义为常量`PHPCMS_ROOT`,方便后续代码引用。使用`str_replace()`函数替换反斜杠为正斜杠,是为了确保在跨平台环境下路径的正确性。
6. 引入其他必要文件:
文件末尾的`requirePHPCMS_ROOT.'/include/g`表明接下来会加载更多PHPCMS的组件和配置,这通常是程序初始化过程的一部分。
这些代码分析揭示了PHPCMS在性能优化、安全防护和跨平台兼容性方面所做的工作,这对于理解和定制PHPCMS是非常有价值的。通过这样的分析,开发者可以更好地了解PHPCMS的内部机制,从而更安全、高效地进行二次开发。