common.inc.php文件1-20行代码分析

/*从今天开始.我会一有时间就对PHPCMS 整站的代码做一个详细的分析.目的很简单.让大家都能在phpchina 里面得到进步.
 
谢谢. 代码讲解分析全部是本人.按照本人的知识水平来讲解.如果有说得不对的.请指正.也欢迎指正.大家一起进步.谢谢
 
希望大家支持哦
 
首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php 这个文件是程序启动的核心文件.复制PHP内容到剪贴板PHP代码:
*/
<?php
/**
代码讲解分析: DreamFight
*/
$mtime = explode(' ', microtime());
$phpcms_starttime = $mtime[1] + $mtime[0];
/**
microtime() 当前 Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
在windows下他的反回结果是这样的形式:0.70312700 1230216275。
explode(separator,string,limit)函数把字符串分割为数组。
参数 描述
separator 必需。规定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可选。规定所返回的数组元素的最大数目。
 
前边这两行的代码主要就是计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。
*/
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);
/*
在php.ini的配置文件中,有个布尔值的设置,就是magic_quotes_runtime,当它打开时,php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。
% S* i; @; k! D- n" p0 k. {7 Q* ~9 U1 i$ Y& {' d4 R2 ]
当然如果重复给溢出字符加反斜线,那么字符串中就会有多个反斜线,所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。. i% @5 ]' C  N8 W. C4 u8 p
6 a; Y" {6 W' H# _! o  h. Z
为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测设置状态秋决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉。& O* W6
地球人都知道。就是关了字符窜入库自动转意 比如 my name is on'x 转成 my name is on \'x 为了最大的程序性能所以我们关掉吧~哈哈
*/
define('IN_PHPCMS', TRUE);
/**
程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。
防止你翻墙进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
那么就基本可以肯定你这个家伙是个小偷来的。 人可能翻墙进入。但程序怎么翻墙呢。只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。
*/
define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));
/**
dirname(dirname(__FILE__));得到的是文件上一层目录名.因为common.inc.php是在include文件夹中的,所以dirname(dirname(__FILE__))的反回地址就是:你的phpcms所在的目录+include,这里它做了substr(dirname(__FILE__), 0, -8))这么个处理,就去掉了include 所以得到的就是你这个phpcms所在机器上的目录了。
要主意substr(dirname(__FILE__), 0, -8))它所得到的目录的路径是是带\的这样是在浏览器中访部一到的所在要把所有的\转成/.
为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这样做哦
*/
require PHPCMS_ROOT.'/include/global.func.php';
/**
包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。 常量 PHPCMS_ROOT 已经发挥作用。 这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。
自己好好理解下。。。。。
global.func.php这个页面等后边用到的时候来一一讲解。
*/
$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() 函数来递归过滤
当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,因为$string已经不是数组而是字符窜。所以 执行 preg_replace()函数。这个函数很好理解了。就是替换了。
这个函数的作用就是把$_POST中的内容用一个strip_sql的方法来处理,
**/
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
/**
使用strip_sql()函数来过滤 $_POST $_GET $_COOKIE;
一般不是开源的站。很少过SQL关键字过滤。不过这个也是冒很大风险的。
来说一下strip_sql这个函数,它和里边的array_map函数一起实现了这个函数的递归调用,以来实现字符的替换。
**/
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进行转意这个选择。如果是的话,就不需要我们自动转意了。如果不是那么还是要老百姓的手段。自己动手丰衣足食。
来看下也是在global.func.php 文件里面定义的这个函数: 其实是一个封装好的php的 addslashes() 函数的函数。PHP都自己有了为什么还要自己封装成函数呢?
理由很简单。为了以后的扩展更改容易罗。如果我们一开始就全部用 addslashes() 这个函数来对 ' 进行转意的话。那么以后随着程序的发展。我可能想多过滤个 ^ * ( )之类的
那如何是好呢?所以为了以后孩子的成长。我们还是最好封起来吧。 记住:以后有可能会边的东西。最好都封装成模块。函数 。类。 这样程序的灵活度就上去了。下面我们就来品一下
这个函数。
function new_addslashes($string)
{
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}
首先判断是不是数组,如果不是那么把该值用作addslashes()的参数,进行转意,并返回。
如果是数组那么一次取出该数组中的值来让它转意。
这个函数也是写得贼好。也是同时考虑过滤 字符窜或数组,也是使用了 传归。看下就应该明白了吧。这个不用说了。我们要学下这个思路这个方法方式哦。这样才能进
*/

posted on 2008-12-10 00:19 丁克设计 阅读(411) 评论(0)  编辑  收藏 所属分类: PHPCMS整站代码讲解


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

留言簿(6)

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜