ThinkPHP框架是当前国内最流行的PHP框架之一,虽然TP3.2.3这个版本和国外的开源框架还是有一定距离,但是人家教程多,用户量多,中文文档写得奇的优点,现在工作的公司用的是thinkphp3.2框架进行开发,TP框架为我们开发者提供了底层的安全过滤功能,所以我在使用TP框架开发的时候并没有很仔细的去想过安全的问题,而最近也是挤出了一点时间,想知道TP框架底层是如何运作的,底层是如何防注入的,看了一下文档,看了一下源码,找了一些资料,整理出了一些TP框架运行的原理。
0x02 简介
通读源码的话,当然要从下载源码开始 : )
下载地址:http://www.thinkphp.cn/down/610.html
版本:ThinkPHP3.2.3完整版
技术准备:PHP基础,MySql基础
使用工具:Visutal Studio Code
服务器环境:xampp
推荐使用:phpStudy (推荐使用这个免得为了环境的问题浪费时间)
安装教程什么的话,我就省略了,我们直接进入正题
0x03 思路
接下来介绍一下大概的思路(完成),然后介绍框架运行的原理,在然后说一下防注入的方法,最后说说审计Tp的思路与方法
本文相关文件:
系统公共函数库: \ThinkPHP\Common\functions.php (封装了TP开放给外部的函数)
ThinkPHP Model模型类: ThinkPHP\Library\Think\Model.class.php (TP的数据库架构类,提供curd类库,是一个对外的接口 )
TP内部curd类: ThinkPHP\Library\Think\Db\Driver.class.php (这个类的函数都被Model类中的curd操作间接的调用)
这里的话要大概说一下Tp在执行数据库操作之前的处理思路。
- 函数
M
使用了以后会自动创建new Model
类并且会实例化为一个对象返回此资源,Ps:这里我们的
M(‘goods’)
goods
是你的数据库表名,我们后面都简称为goods
对象, - 接着这个
goods
对象调用了where
方法并且格式化处理以后,会将这个值赋值给goods
对象的一个成员变量$options
(注:这里需要特别说明一点,如果说我们在goods
对象中有调用其他的方法赋值例如where,table,alias,data,field,order,limit,page,group,having,join,union,distinct,lock,cache,comment
等等这种操作方法,那么都会先赋值给goods
对象,而不是在代码直接进行sql语句拼接,所以我们使用Tp的连贯操作的时候,就不需要像SQL语句拼接那样需要考虑到关键字的顺序问题,想了解有关于M
函数的具体信息的请下载TP3.2.3开发手册中的模型与连贯操作进行仔细了解,(因为时间的问题这里就不很仔细的讲解) - 处理完了前面选项之后,接下来就会去调用我们的
find()
方法去调用底层的一个select
方法(Driver.class.php这个类中的select方法)来获取数据。所谓的find()方法就是等同于先给goods
对象的一个成员变量$options
赋值操作limit=1
然后进行select
操作来获取对应的数据。 - 到了
select
操作以后又是一个完全不一样的世界。最终执行的sql语句的话大概是这样:
SELECT * FROM `tdb_goods` WHERE goods_name='R510VC 15.6英寸笔记本' limit 1
如果给他赋值了一个操作例如
M('goods')->field('goods_id,goods_name')->where( array('goods_name'=>$goods_name) )->find();
最终执行的sql语句:
SELECT goods_id,goods_name FROM `tdb_goods` WHERE goods_name='R510VC 15.6英寸笔记本' limit 1
Driver.class.php这个类中除了处理curd
操作,还处理pdo
绑定,这里的pdo
绑定并不是我们本文的重点内容所以简单提起他知道有这么一个东西就完了,我们的重点是了解TP的curd
操作是如何进行的。
//这里可以开始真真分析了 说明连接的过程执行的操作等
0x04 正文
我们一个一个解释来,先按顺序来介绍Model模型类几个重要的成员变量
转载请注明:XAMPP中文组官网 » ThinkPHP3.2.3