phpcms 源码分析一: common.inc.php

    其实就是从网上找到的的逆雪寒的分析, 我下来之后发现格式和错字的问题,非常影响阅读,现在我就是做了下搬运工的角色, 同时将格式调整到可读性提高点而已,让各位看官稍微舒心点;

  下面进入整体:

  

  1 <?php
  2         /*
  3         国内著名CMS: PHPCMS 整站代码分析讲解 -2008-1-2已更新(# 20页)(第三章继续进行中..)
  4         CMS, 著名, 代码, 讲解
  5         本帖最后由 逆雪寒 于 2010-2-20 17:21 编辑 
  6         
  7         谢谢.  代码讲解分析全部是本人.按照本人的知识水平来讲解.如果有说得不对的.请指正.也欢迎指正.大家一起进步.谢谢
  8         
  9         希望大家支持哦  
 10         
 11         首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php   这个文件是程序启动的核心文件.
 12         
 13         
 14         /*
 15         代码讲解分析: 逆雪寒. 2007 - 12 - 20 
 16         */
 17 
 18 
 19         /*
 20          计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。
 21         */
 22         $mtime = explode(' ', microtime());  
 23         
 24         $phpcms_starttime = $mtime[1] + $mtime[0];
 25         
 26         /*
 27          把  $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL  因为php4.1.0以上默认以 $_POST 来替代。
 28         unset后防止程序运行在低版本会出现安全等问题。比如变量注入
 29         */
 30         
 31         unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, 
 32               $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
 33 
 34         /*
 35          * 地球人都知道。关了字符串入库自动转意 比如  my name is on'x     转成  my name is on \'x
 36          * 为了最大的程序性能所以我们关掉吧~哈哈
 37          */
 38         set_magic_quotes_runtime(0); 
 39         
 40         /*
 41          程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。
 42         防止你FQ进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,
 43         然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
 44         那么就基本可以肯定你这个家伙是个小偷来的。 人可能FQ进入。但程序怎么FQ呢。
 45         只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。
 46         你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。
 47         */
 48 
 49         
 50         /*
 51          为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这样做哦
 52         */
 53         
 54         define('IN_PHPCMS', TRUE);
 55          
 56 
 57 
 58         /*
 59          包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。  常量 PHPCMS_ROOT 已经发挥作用。
 60         这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。自己好好理解下。。。。。
 61         */
 62 
 63         require PHPCMS_ROOT.'/include/global.func.php';  
 64         
 65 
 66         // 以下关键字无视大小写
 67         /*
 68          ("/ union /i")  这个是正则的写法?不懂正则的自己百度找教程来学。 这里不详细说了
 69         */        
 70         $search_arr = array("/ union /i","/ select /i",
 71                 "/ update /i","/ outfile /i","/ or /i");
 72          
 73 
 74         /*
 75          看这个意思很明了。 union :连接两条SQL语句。 outfile : 主要用来导出数据库资料到其他介质上。
 76         干啥字要定义这两个变量呢? 在 global.func.php 文件(前面已经加载)里面有个函数 strip_sql() 各位可以看下。
 77         */
 78         $replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
 79         
 80 
 81         /*
 82          函数里面定义了这两个变量为 global全局变量。 那么函数里就可以直接使用了。
 83         先讲解下这个函数吧。 顾名思义这个函数是过滤字符串里面的SQL语句使得关键的SQL语句单词失效。
 84         主要过滤那些SQL语句呢。 主要是这几个关键字: union  select  update outfile  or 等。
 85         因为这几个SQL字是极度容易在$_GET传输中给截注.
 86         这个函数写得实在精妙。  is_array 来判断 $string 是否为数组。
 87         如果 是  就 array_map() 函数来递归过滤 $string数组里面的每一个单元. 每个单元是一个字符串吧?
 88         当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,
 89         因为$string已经不是数组而是字符串。所以 执行 preg_replace()函数。这个函数很好理解了。就是替换了。
 90         */        
 91         function strip_sql($string)
 92         {
 93             global $search_arr,$replace_arr;
 94             return is_array($string) 
 95                  ? array_map('strip_sql', $string) 
 96                  : preg_replace($search_arr, $replace_arr, $string);
 97         }
 98         
 99         /*
100          使用strip_sql()函数来过滤 $_POST  $_GET   $_COOKIE;
101         一般不是开源的站。很少过SQL关键字过滤。不过这个也是冒很大风险的。
102         */
103 
104         $_POST = strip_sql($_POST);
105         
106         $_GET = strip_sql($_GET);
107         
108         $_COOKIE = strip_sql($_COOKIE);
109         
110 
111         /*
112          unset 使用过但以后不需要的变量。这个是很好的习惯。第一不会浪费内存。
113         如果变量存了大量的数据字节,而后你的程序是一直不需要用的。
114         那么就会很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉。
115         */
116         unset($search_arr, $replace_arr);
117         
118 
119 
120         // get_magic_quotes_gpc()检测gpc是否系统自动转意。 gpc 是什么呢? 
121         // GET POST COOKIE 来来去去就这几个东西罗。会返回 真或假
122         /*
123          判断一下系统是否打开了自动对gpc进行转意这个选择。如果是的话,就不需要我们自动转意了。如果不是那么还是要老百姓的手段。自己动手丰衣足食。
124         来看下也是在global.func.php 文件里面定义的这个函数: 其实是一个封装好的php的 addslashes() 函数的函数。
125         PHP都自己有了为什么还要自己封装成函数呢?
126         理由很简单。为了以后的扩展更改容易罗。如果我们一开始就全部用 addslashes() 这个函数来对 ' 进行转意的话。
127         那么以后随着程序的发展。我可能想多过滤个 ^ * ( )之类的
128         那如何是好呢?所以为了以后孩子的成长。我们还是最好封起来吧。
129         记住:以后有可能会边的东西。最好都封装成模块。函数 。类。 这样程序的灵活度就上去了。
130         */
131         $magic_quotes_gpc = get_magic_quotes_gpc();
132          
133         if(!$magic_quotes_gpc)
134         {
135             $_POST = new_addslashes($_POST);
136             
137             $_GET = new_addslashes($_GET);
138         }
139         
140 
141         /*
142          这个函数也是写得贼好。也是同时考虑过滤 字符串或数组,也是使用了 递归。
143         看下就应该明白了吧。这个不用说了。我们要学下这个思路这个方法方式哦。
144         这样才能进步。哈哈。我们要懂模仿。
145         */
146         
147         function new_addslashes($string)
148         {
149             if(!is_array($string)) { 
150                 return addslashes($string);
151             }
152             
153             foreach($string as $key => $val) {
154                 $string[$key] = new_addslashes($val);
155             }
156             
157             return $string;
158         }
159         
160         /*
161          嘿。 extract 前面加个 @鸡蛋做什么呢??抑制错误的。还不懂的话。自己百度了。
162         为什么用extract()函数呢.  平时我们程序 是不是要常使用 $_POST  $_GET来获取传递的变量呀。是不是感觉贼麻烦呀。
163         比如 $_POST['xx']  这样接受是挺好。但写多了很麻烦是吧。我是感觉麻烦。我现在想直接就 $xx就可以获取传递过来的东西。
164         那怎么办呢。就用了 extract()函数来实现这么一个技巧。 这个技巧在discuz 论坛上也有应用。
165         */
166         
167         @extract($_POST, EXTR_OVERWRITE); // EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
168         
169         @extract($_GET, EXTR_OVERWRITE);
170 
171         /*
172          unset() 好处不用说了吧。 释放 $_POST $_GET 数组 ,因为已经不需要他们了。
173         */
174         unset($_POST, $_GET);
175         
176 ?>

 

posted on 2013-09-29 12:34  thoupin  阅读(892)  评论(0编辑  收藏  举报

导航