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 ...
随机推荐
- 【Quick 3.3】资源脚本加密及热更新(一)脚本加密
[Quick 3.3]资源脚本加密及热更新(一)脚本加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.脚本加密 quick框架已经封装好加密模块,与加密有关的文件在引擎目录/quic ...
- linux进程间通信方式
(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. (2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具 ...
- Layout Resource官方教程(2)用ViewStub引用的嵌入的layout可推迟加载
Loading Views On Demand THIS LESSON TEACHES YOU TO Define a ViewStub Load the ViewStub Layout YOU SH ...
- 【原创】FPGA开发手记(一) UART接口
以下内容均以Xilinx的Nexys3作为开发板 1. UART简介 UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串 ...
- 【HDOJ】1086 You can Solve a Geometry Problem too
数学题,证明AB和CD.只需证明C.D在AB直线两侧,并且A.B在CD直线两侧.公式为:(ABxAC)*(ABxAD)<= 0 and(CDxCA)*(CDxCB)<= 0 #includ ...
- poj2079
根据凸包的单峰性质,穷举第一个顶点然后先更新第三个顶点,再更新第二个顶点 ..] of longint; ans,n,t,k,i,j:longint; function cross(i,j,k:lon ...
- addChildViewController 与 addSubview
在viewcontrollerA中, 如果想把controllerB.view添加进来, 可以用 addSubview, 但如果controllerB中有个事件, 使用到 self.navigatio ...
- c# 提取word文件中的图片问题
最近遇到一个项目就是要从一份word中提取出所有的图片信息,功能看起来不是很难,只要使用office自带的Microsoft.Office.Interop.Word就可以解决问题.网上也有不少的文章来 ...
- Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法
一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...
- Java语言使用HttpClient模拟浏览器登录
使用HttpClient来模拟浏览器登录网站,然后可以进行操作,比如发布信息等 第一步:获取实际的post网址,(不考虑复杂情况下) 1.需要使用到firefox的httpfox插件,httpfox中 ...