phpcms 源码分析一: common.inc.php
其实就是从网上找到的的逆雪寒的分析, 我下来之后发现格式和错字的问题,非常影响阅读,现在我就是做了下搬运工的角色, 同时将格式调整到可读性提高点而已,让各位看官稍微舒心点;
下面进入整体:
<?php
/*
国内著名CMS: PHPCMS 整站代码分析讲解 -2008-1-2已更新(# 20页)(第三章继续进行中..)
CMS, 著名, 代码, 讲解
本帖最后由 逆雪寒 于 2010-2-20 17:21 编辑 谢谢. 代码讲解分析全部是本人.按照本人的知识水平来讲解.如果有说得不对的.请指正.也欢迎指正.大家一起进步.谢谢 希望大家支持哦 首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php 这个文件是程序启动的核心文件. /*
代码讲解分析: 逆雪寒. 2007 - 12 - 20
*/ /*
计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。
*/
$mtime = explode(' ', microtime()); $phpcms_starttime = $mtime[1] + $mtime[0]; /*
把 $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL 因为php4.1.0以上默认以 $_POST 来替代。
unset后防止程序运行在低版本会出现安全等问题。比如变量注入
*/ unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS,
$HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS); /*
* 地球人都知道。关了字符串入库自动转意 比如 my name is on'x 转成 my name is on \'x
* 为了最大的程序性能所以我们关掉吧~哈哈
*/
set_magic_quotes_runtime(0); /*
程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。
防止你翻墙进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,
然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
那么就基本可以肯定你这个家伙是个小偷来的。 人可能翻墙进入。但程序怎么翻墙呢。
只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。
你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。
*/ /*
为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这样做哦
*/ define('IN_PHPCMS', TRUE); /*
包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。 常量 PHPCMS_ROOT 已经发挥作用。
这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。自己好好理解下。。。。。
*/ require PHPCMS_ROOT.'/include/global.func.php'; // 以下关键字无视大小写
/*
("/ union /i") 这个是正则的写法?不懂正则的自己百度找教程来学。 这里不详细说了
*/
$search_arr = array("/ union /i","/ select /i",
"/ update /i","/ outfile /i","/ or /i"); /*
看这个意思很明了。 union :连接两条SQL语句。 outfile : 主要用来导出数据库资料到其他介质上。
干啥字要定义这两个变量呢? 在 global.func.php 文件(前面已经加载)里面有个函数 strip_sql() 各位可以看下。
*/
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or '); /*
函数里面定义了这两个变量为 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()函数。这个函数很好理解了。就是替换了。
*/
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);
} /*
使用strip_sql()函数来过滤 $_POST $_GET $_COOKIE;
一般不是开源的站。很少过SQL关键字过滤。不过这个也是冒很大风险的。
*/ $_POST = strip_sql($_POST); $_GET = strip_sql($_GET); $_COOKIE = strip_sql($_COOKIE); /*
unset 使用过但以后不需要的变量。这个是很好的习惯。第一不会浪费内存。
如果变量存了大量的数据字节,而后你的程序是一直不需要用的。
那么就会很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉。
*/
unset($search_arr, $replace_arr); // get_magic_quotes_gpc()检测gpc是否系统自动转意。 gpc 是什么呢?
// GET POST COOKIE 来来去去就这几个东西罗。会返回 真或假
/*
判断一下系统是否打开了自动对gpc进行转意这个选择。如果是的话,就不需要我们自动转意了。如果不是那么还是要老百姓的手段。自己动手丰衣足食。
来看下也是在global.func.php 文件里面定义的这个函数: 其实是一个封装好的php的 addslashes() 函数的函数。
PHP都自己有了为什么还要自己封装成函数呢?
理由很简单。为了以后的扩展更改容易罗。如果我们一开始就全部用 addslashes() 这个函数来对 ' 进行转意的话。
那么以后随着程序的发展。我可能想多过滤个 ^ * ( )之类的
那如何是好呢?所以为了以后孩子的成长。我们还是最好封起来吧。
记住:以后有可能会边的东西。最好都封装成模块。函数 。类。 这样程序的灵活度就上去了。
*/
$magic_quotes_gpc = get_magic_quotes_gpc(); if(!$magic_quotes_gpc)
{
$_POST = new_addslashes($_POST); $_GET = new_addslashes($_GET);
} /*
这个函数也是写得贼好。也是同时考虑过滤 字符串或数组,也是使用了 递归。
看下就应该明白了吧。这个不用说了。我们要学下这个思路这个方法方式哦。
这样才能进步。哈哈。我们要懂模仿。
*/ function new_addslashes($string)
{
if(!is_array($string)) {
return addslashes($string);
} foreach($string as $key => $val) {
$string[$key] = new_addslashes($val);
} return $string;
} /*
嘿。 extract 前面加个 @鸡蛋做什么呢??抑制错误的。还不懂的话。自己百度了。
为什么用extract()函数呢. 平时我们程序 是不是要常使用 $_POST $_GET来获取传递的变量呀。是不是感觉贼麻烦呀。
比如 $_POST['xx'] 这样接受是挺好。但写多了很麻烦是吧。我是感觉麻烦。我现在想直接就 $xx就可以获取传递过来的东西。
那怎么办呢。就用了 extract()函数来实现这么一个技巧。 这个技巧在discuz 论坛上也有应用。
*/ @extract($_POST, EXTR_OVERWRITE); // EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。 @extract($_GET, EXTR_OVERWRITE); /*
unset() 好处不用说了吧。 释放 $_POST $_GET 数组 ,因为已经不需要他们了。
*/
unset($_POST, $_GET); ?>
phpcms 源码分析一: common.inc.php的更多相关文章
- phpcms 源码分析三:common.inc.php
这次是逆雪寒分析common.inc.php的数据库部分: <?php // 包含数据库操作类,下章详说 require PHPCMS_ROOT.'/include/'.$db_file.'.c ...
- phpcms 源码分析二:
这次是逆雪寒的common.inc.php第二部分: <?php /* 明天放假了.今天在写点罗.放假没空写了.要陪老婆,大家看了有什么不明白的.可以跟帖问.我懂的我会回答.谢谢 [/php] ...
- phpcms 源码分析六:index文件
这次是逆雪寒对index.php的分析: /* [/php] [ 本帖最后由 逆雪寒 于 2007-12-25 16:12 编辑 ] 尽量每天都有新的东西每天都能进一小步 现在开始讲 index.ph ...
- phpcms 源码分析五:文件缓存实现
这次是逆雪寒的文件缓存实现代码分析: /* [/php] PHPCMS的文本缓存实现: [php] <?php /* 这个文件里面全是有关生成文本缓存的函数.文本缓存是个好东西.一般的项目,我们 ...
- phpcms 源码分析四: 数据库类实现
这次是逆雪寒的数据库类分析: <?php /* 这个讲 phpcms 的数据库类 和 phpcms 的文本缓存的实现.看了看 都是很简单的东西.大家看着我注释慢慢看吧.慢慢理解,最好能装了PHP ...
- phpcms 源码分析七: 模板引擎实现
这次是逆雪寒对模板引擎实现的分析: 1 /* 函数 template函数是在global.func.php 里面定义的. 在前面的phpcms 的首页 index.php 里就见到了. 用法: inc ...
- PHPCMS源码分析
PHPCMS 一.模版引擎 如:调用单页面index.php?m=content&c=index&a=lists&catid=9.1.先获取到模版变量的值$template_l ...
- u-boot源码分析之C语言段
题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...
- LinqToDB 源码分析——生成表达式树
当我们知道了Linq查询要用到的数据库信息之后.接下就是生成对应的表达式树.在前面的章节里面笔者就已经介绍过.生成表达式树是事实离不开IQueryable<T>接口.而处理表达式树离不开I ...
随机推荐
- 关于checkbox的checked属性和change事件
jquery中的attr和prop有什么区别? To retrieve and change DOM properties such as the checked, selected, or disa ...
- Android-相册效果(图片缩放 自由滑动)
先上图: 很多时候 我们会有这么一个需求: 展示一组图片 每个Item的图片 可以自由拉伸 滑动 焦点不冲突 网上有很多实现方法 通过自定义Gallery和ImageView来实现 个人不是很推荐 在 ...
- Subline Text快捷键
我经常使用的快捷键 Ctrl+A: 全选Ctrl+C: 复制 重复工作必备: Ctrl+D:选择单词,重复可增加选择下一个相同的单词Alt+F3:选择所有相同的词F3: 下一个Shift+F3:前一个 ...
- bzoj3796
好像已经很久没有做后缀数组的题目,导致这种题一开始没想出来看到公共子串肯定想到后缀数组吧,但我都忘了最长公共子串怎么求了重要的性质:最长公共子串=max(h[i])名次相邻的两个后缀要分别属于s1,s ...
- c#语言-多线程中的锁系统(一)
介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. ...
- 在SQL2005实现维护计划-备份数据库
一.備份數據庫維護計劃方案 [注]: 1.先啟動SQL Server Agent服務 2..交易記錄備份 (只限於完整和大量記錄復原模式). 3.下面中”清除備份trn文件” & “清除備份日 ...
- boost总结之variant
boost的variant库类似于联合体,但是联合体中只能接受POD类型,但variant中并无此限制,它可以接受任意的类型. boost::variant <int, std::strin ...
- ActiveMQ, RabbitMQ和ZeroMQ 选型关注点
选择MQ时,主要关注的特性,可能就以下几个: 通信模式(是否满足业务场景): ActiveMQ: queue(producer/consumer), topic(publisher/subsriber ...
- asp.net基础
这篇主要讲述以下基础知识: Request对象 Response对象 Server对象 Cookie对象 Application对象 ViewState对象 <%%>与<%=%> ...
- 从html5标准的正式发布到国内CMS的变革
10月底万维网联盟(W3C)宣布,经过将近8年的艰辛努力,HTML5标准规范终于最终制定完成并正式发布. W3C的正式批准让人们对HTML5更有信心.“这是一个里程碑,标志着很多人员在长达七年时间内投 ...