PHPCMS 整站代码分析讲解(一) 整站代码分析讲解(
昨天在网上逛看到这个帖子,就转来与大家分享!原 作者 逆雪寒。
首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php 件. [Copy to clipboard] [ - ] CODE: 问题。比如变量注入 */ set_magic_quotes_runtime(0); //地球人都知道。关了字符窜入库自动转意 比如 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))); /** 为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使 用。建议大家都这样做哦 转成 my name is on \'x 为了最大
这个文件是程序启动的核心文
*/ 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()函数。这个函数很好理解了。就是替换了。