日期:2014-05-17  浏览次数:20346 次

国内著名CMS: PHPCMS 整站代码分析讲解

国内著名CMS: PHPCMS 整站代码分析讲解 ?

2010-05-11 11:28:00|? 分类: 建站 |? 标签: |字号大中小 订阅

原贴地址:http://www.phpchina.com/bbs/thread-47107-1-1.html

作者:逆雪寒

从今天开始.我会一有时间就对PHPCMS 整站的代码做一个详细的分析.目的很简单.让大家都能在phpchina 里面得到进步.

谢谢.? 代码讲解分析全部是本人.按照本人的知识水平来讲解.如果有说得不对的.请指正.也欢迎指正.大家一起进步.谢谢

希望大家支持哦 ?

首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php?? 这个文件是程序启动的核心文件.

引用:

??? <?php

??? /**

??? 代码讲解分析: 逆雪寒. 2007 - 12 - 20

??? */

??? $mtime = explode(' ', microtime()); ?

??? $phpcms_starttime = $mtime[1] + $mtime[0];

??? /**

??? 计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。

??? */

??? unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);

??? /**

??? 把? $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL? 因为php4.1.0以上默认以 $_POST 来替代。unset后防止程序运行在低版本会出现安全等问题。比如变量注入

??? */

??? set_magic_quotes_runtime(0);

??? //地球人都知道。关了字符窜入库自动转意 比如? my name is on'x???? 转成? my name is on \'x? 为了最大的程序性能所以我们关掉吧~哈哈

??? define('IN_PHPCMS', TRUE);

??? /**

??? 程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。

??? 防止你fan*qiang进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,

??? 那么就基本可以肯定你这个家伙是个小偷来的。 人可能fan*qiang进入。但程序怎么fan*qiang呢。只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。

??? */

??? define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));

??? /**

??? 为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这样做哦

??? */

??? require PHPCMS_ROOT.'/include/global.func.php'; ?

??? /**

??? 包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。? 常量 PHPCMS_ROOT 已经发挥作用。 这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。

??? 自己好好理解下。。。。。

??? */

??? $search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");

??? /**

??? ("/ union /i")? 这个是]正则的写法?不懂]正则的自己百度找教程来学。 这里不详细说了

??? */

??? $replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');

??? /**

??? 看这个意思很明了。 union :连接两条SQL语句。 outfile : 主要用来导出数据库资料到其他介质上。

??? 干啥字要定义这两个变量呢? 在 global.func.php 文件(前面已经加载)里面有个函数 strip_sql() 各位可以看下。

??? function strip_sql($string)

??? {

??? global $search_arr,$replace_arr;

??? return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);

??? }

??? 函数里面定义了这两个变量为 global全局变量。 那么函数里就可以直接使用了。? 先讲解下这个函数吧。 顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。

??? 主要过滤那些SQL语句呢。 主要是这几个关键字: union? select? update outfile? or 等。因为这几个SQL字是极度容易在$_GET传输中给截注.

??? 这个函数写得实在精妙。? is_array 来判断 $string 是否为数组。如果 是? 就 array_map() 函数来递归过滤 $string数组里面的每一个单元. 每个单元是一个字符窜吧?

??? 当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,因为$string已经不是数组而是字符窜。所以 执行 preg_replace()函数。这个函数很好理解了。就是替换了。

??? */

??? $_POST = strip_sql($_POST);

??? $_GET = strip_sql($_GET);

??? $_COOKIE = strip_sql($_COOKIE);

??? /**

??? 使用strip_sql()函数来过滤 $_POST? $_GET?? $_COOKIE;

??? 一般不是开源的站。很少过SQL关键字过滤。不过这个也是冒很大风险的。

??? */

??? unset($search_arr, $replace_arr);

??? /**

??? unset 使用过但以后不需要的变量。这个是很好的习惯。第一不会浪费内存。如果变量存了大量的数据字节,而后你的程序是一直不需要用的。那么

??? 就会很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉。

??? */

??? $magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()检测gpc是否系统自动转意。 gpc 是什么呢? GET POST COOKIE 来来去去就这几个东西罗。会返回 真或假

??? if(!$magic_quotes_gpc)

??? {

??? $_POST = new_addslashes($_POST);

??? $_GET = new_addslashes($_GET);

??? }

??? /**

??? 判断一下系统是否打开了自动对gpc进行转意这个选择。如果是的话,就不需要我们自动转意了。如果不是那么还是要老百姓的手段。自己动手丰衣足食。

???