其实就是从网上找到的的逆雪寒的分析, 我下来以后发现格式和错字的问题,很是影响阅读,如今我就是作了下搬运工的角色, 同时将格式调整到可读性提升点而已,让各位看官稍微舒心点;php
下面进入总体:html
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 ?>