zoukankan
html css js c++ java
PHPCMS 整站代码分析讲解(一)
PHPCMS
整站代码分析讲解(一)
昨天在网上逛看到这个帖子,就转来与大家分享!原作者 逆雪寒。 首先我对
PHPCMS
的 头程序文件开始讲解
: include/common.inc.php
这个文件是程序启动的核心文件
.
[Copy to clipboard]
[ - ]
CODE: <?php /** 代码讲解分析: 逆雪寒
. 2007 - 12 - 20
*/ $mtime = explode(' ', microtime()); $phpcms_starttime = $mtime[1] + $mtime[0]; /** 计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。 */ 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); //
地球人都知道。关了字符窜入库自动转意 比如
my name is on'x
转成
my name is on \'x
为了最大的程序性能所以我们关掉吧
~
哈哈
define('IN_PHPCMS', TRUE); /** 程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。 防止你FQ进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量
IN_PHPCMS
为
TRUE
,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
那么就基本可以肯定你这个家伙是个小偷来的。 人可能FQ进入。但程序怎么FQ呢。只要在
php.ini
文件里面激活
allow_url_fopen
选项,
include()
就可以包含
URL
地址了。你想下如果你有个 放密码的
PHP
文件。如果给人家
include
了以后。你怕不怕。
*/ define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8))); /** 为了程序产品的跨平台。自动获取程序的安装目录路径
,
定义为
PHPCMS_ROOT
常量。方便以后程序使用。建议大家都这样做哦
*/ require PHPCMS_ROOT.'/include/global.func.php'; /** 包含 全局函数
global.func.php
文件。里面放了些程序全局都有需要用的函数
.
大家看到了吧。
常量
PHPCMS_ROOT
已经发挥作用。 这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。
自己好好理解下。。。。。 */ $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()
函数来递归过滤
$string
数组里面的每一个单元
.
每个单元是一个字符窜吧?
当递归调用
strip_sql()
以后
is_array()
判断
$string
肯定为假了,因为
$string
已经不是数组而是字符窜。所以 执行
preg_replace()
函数。这个函数很好理解了。就是替换了。
*/ $_POST = strip_sql($_POST); $_GET = strip_sql($_GET); $_COOKIE = strip_sql($_COOKIE); /** 使用
strip_sql()
函数来过滤
$_POST $_GET $_COOKIE;
一般不是开源的站。很少过
SQL
关键字过滤。不过这个也是冒很大风险的。
*/ 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; } 这个函数也是写得贼好。也是同时考虑过滤 字符窜或数组,也是使用了 传归。看下就应该明白了吧。这个不用说了。我们要学下这个思路这个方法方式哦。这样才能进步。 哈哈。我们要懂模仿。 */ @extract($_POST, EXTR_OVERWRITE); @extract($_GET, EXTR_OVERWRITE); /** 嘿。
extract
前面加个
@
鸡蛋做什么呢??抑制错误的。还不懂的话。自己百度了。
为什么用
extract()
函数呢
.
平时我们程序 是不是要常使用
$_POST $_GET
来获取传递的变量呀。是不是感觉贼麻烦呀。
比如
$_POST['xx']
这样接受是挺好。但写多了很麻烦是吧。我是感觉麻烦。我现在想直接就
$xx
就可以获取传递过来的东西。那怎么办呢。
就用了
extract()
函数来实现这么一个技巧。 这个技巧在
discuz
论坛上也有应用。
*/ unset($_POST, $_GET); /** unset()
好处不用说了吧。 释放
$_POST $_GET
数组 ,因为已经不需要他们了。
*/ ?> 明天放假了.今天在写点罗.放假没空写了.要陪老婆,大家看了有什么不明白的.可以跟帖问.我懂的我会回答.谢谢
查看全文
相关阅读:
软件包管理(rpm&yum)
文本处理三剑客之sed
压缩归档tar
linux文件查找find
vim编辑器
正则表达式
文本处理三剑客之grep
常用文本处理、统计工具
文件权限管理
用户和组管理
原文地址:https://www.cnblogs.com/gxldan/p/4066739.html
最新文章
JavaScript 数据类型
JavaScript简介
JavaScript基础 :学习javascript的原因
centos7安装部署gitlab服务器
vue做的简单购物车
python pdb小结
MongoDB常用操作整理
常见的反爬机制说明和相应的解决方法
【BZOJ4555】【TJOI2016】【HEOI2016】求和 第二类斯特林数 NTT
【BZOJ3456】轩辕朗的城市规划 无向连通图计数 CDQ分治 FFT 多项式求逆 多项式ln
热门文章
【八皇后问题】
抢券活动,导致接口服务死掉。
app发布当天,用户无法登录
win7 部署tomcat
如何实现QQ附件在线预览功能
任务计划cron
linux进程管理
linux网络配置详解
计算机网络
磁盘和文件系统
Copyright © 2011-2022 走看看