审计工作准备真的折磨我,记录一下方便我复习也方便你们学习

首先是TP源码下载

安装php环境就不说了,,,

安装composer

在命令执行窗口输入

curl -sS https://getcomposer.org/installer | php

TP审计入门1
这个位置是保存的目录,也就是你CMD打开的目录

下载后,检查Composer是否能正常工作,只需要通过 php 来执行 PHAR:

php composer.phar

TP审计入门2

这样就是成功了,然后将composer.phar 移动到bin目录下并改名为composer:

Composer安装好之后,打开命令行,切换到你的web根目录下面并执行下面的命令:

composer create-project topthink/think=5.1.20 tp5.1.20  --prefer-dist

如果想要切换到其他版本,修改版本号即可,验证是否可以正常运行,在浏览器输入:

http://localhost/tp5.1.20/public/

IDE环境搭建及xdebug配置

安装phpstorm!用了的都说好phpstorm安装就不讲了,讲一下Xdebug怎么安装配置

Xdebug是一个开放源代码的PHP程序调试器,可以用来跟踪,调试和分析PHP程序的运行状况。在调试分析代码时,xdebug十分好用。

  1. 在chrome拓展商店里下载xdebug helper https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
  2. 打开php.ini文件,添加xdebug相关配置
[xdebug]

xdebug.remote_enable = 1

xdebug.remote_handler = dbgp

xdebug.remote_host = 127.0.0.1

xdebug.remote_port = 9000 #端口号可以修改,避免冲突

xdebug.idekey = PHPSTROM

然后重启服务

然后配置phpstorm,让它可以debug(他不是一个成熟的phpstorm,不能自己debug)首先使用组合键Ctrl+Alt+S

TP审计入门3

TP审计入门4在选择PHP执行文件的时候,会显示 “Debugger:Xdebug”,如果没有的话,点击open打开配置文件。把前面的注释,也就是分号去掉

TP审计入门5

然后配置php环境下的debug;Port和配置文件中的xdebug.remote_port要一致。

TP审计入门6

填写的内容和上面php.ini内的相对应。

TP审计入门7

配置服务器,点+号添加

TP审计入门8

配置配置debug模式

TP审计入门9

TP审计入门10

然后验证一下就行了

Xdebug使用

TP审计入门11

开启监听,然后下一个断点,在浏览器运行,就停在断点了

框架流程分析

下面详细记录几个位置,入口文件index.php非常简洁,只有三行代码。首先定义了一下命名空间,然后加载一些基础文件后,就开始执行应用。

第二行引入base.php基础文件,加载了Loader类,然后注册了一些机制–如自动加载功能、错误异常的机制、日志接口、注册类库别名。

TP审计入门12

这些机制中比较重要的一个是自动加载功能,系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载。

首先需要注册自动加载功能,注册主要由以下几部分组成:

  1. 注册系统的自动加载方法 \think\Loader::autoload
  2. 注册系统命名空间定义
  3. 加载类库映射文件(如果存在)
  4. 如果存在Composer安装,则注册Composer自动加载
  5. 注册extend扩展目录

在加载完这些基础功能之后,程序就会开始执行应用,它通过调用app类中的run()方法去实例化app类。 在run()方法中,包含了应用执行的整个流程。

TP审计入门13

  1. $this->initialize(),首先会初始化一些应用。例如:加载配置文件、设置路径环境变量和注册应用命名空间等等。
  2. this->hook->listen(‘app_init’); 监听app_init应用初始化标签位。Thinkphp中有很多标签位置,也可以把这些标签位置称为钩子,在每个钩子处我们可以配置行为定义,通俗点讲,就是你可以往钩子里添加自己的业务逻辑,当程序执行到某些钩子位置时将自动触发你的业务逻辑。
  3. 模块\入口绑定TP审计入门14进行一些绑定操作,这个配置就会执行,默认情况下,这两个判断条件均为false
  4. $this->hook->listen(‘app_dispatch’);监听app_dispatch应用调度标签位。和2中的标签位同理,所有标签位作用都是一样的,都是定义一些行为,只不过位置不同,定义的一些行为的作用也有所区别。
  5. $dispatch = $this->routeCheck()->init(); 开始路由检测,检测的同时会对路由进行解析,利用array_shift函数一一获取当前请求的相关信息(模块、控制器、操作等)。
  6. this>request>dispatch(this->request->dispatch(dispatch);记录当前的调度信息,保存到request对象中。
  7. 记录路由和请求信息TP审计入门15如果开启了debug模式,会把当前的路由和请求信息记录到日志中。
  8. $this->hook->listen(‘app_begin’); 监听app_begin(应用开始标签位)。
  9. 根据获取的调度信息执行路由调度TP审计入门16期间会调用Dispatch类中的exec()方法对获取到的调度信息进行路由调度并最终获取到输出数据response。然后将response。 然后将response返回,最后调用Response类中send()方法,发送数据到客户端,将数据输出到浏览器页面上。 在应用的数据响应输出之后,系统会进行日志保存写入操作,并最终结束程序运行。
  10. 命名空间特性

ThinkPHP5.1遵循PSR-4自动加载规范,只需要给类库正确定义所在的命名空间,并且命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载。

例如,\think\cache\driver\File类的定义为:

namespace think\cache\driver;

class File 

{

}

如果我们实例化该类的话,应该是:

$class = new \think\cache\driver\File();

系统会自动加载该类对应路径的类文件,其所在的路径是 thinkphp/library/think/cache/driver/File.php。

可是为什么路径是在thinkphp/library/think下呢?这就要涉及要另一个概念—根命名空间。

跟命名空间特性

根命名空间是一个关键的概念,以上面的\think\cache\driver\File类为例,think就是一个根命名空间,其对应的初始命名空间目录就是系统的类库目录(thinkphp/library/think),我们可以简单的理解一个根命名空间对应了一个类库包。

系统内置的几个根命名空间(类库包)如下:

名称 描述 根库目录
think 系统核心类库 thinkphp/library/think
traits 系统Trait类库 thinkphp/library/traaits
app 应用类库 Application

URL访问

1.PATHINFO模式

   http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2
   如果要修改 URL中的 “/” 可以在配置文件中添加 'URL_PATHINFO_DEPR'=>'-'

├─application 应用目录(可设置)
│ ├─index 模块目录(可更改)
│ │ ├─controller 控制器目录
│ │ |–Index.php

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        return '姜小孩在线学TP框架和MVC模式';
    }
}

这时候url访问方法为

http://localhost/tp5/index.php/index/index/index

如果修改index方法为hello:

<?--application/index/controller/Index.php -->
<?php
namespace app\index\controller;//命名空间
class Index //index控制器
{
    public function hello() //hello操作方法
    {
        return '姜小孩在线学TP框架和MVC模式';
    }
}
?>

这时候访问url就应该是

http://localhost/TP5/index.php/index/index/hello

也就是调用了index下的controller的index.php的hello方法

2.普通模式

http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2
http://192.168.1.11/think/index.php?m=index&a=test

3.REWRITE模式

   http://域名/项目名/模块名/方法名/键1/值1/键2/值2
   需要修改 Apache 的配置文件 httpd.conf 文件

4.兼容模式

http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2

强调一点,在通过$_SERVER[‘PATH_INFO’]获取值时,系统会把’‘自动转换为’/',并且系统及版本之间应该不会有所差异)。

下面再分别介绍下入口文件、模块、控制器、操作、参数名/参数值。

  1. 入口文件

文件地址:public\index.php

作用:负责处理请求

  1. 模块(以前台为例)

模块地址:application\index

作用:网站前台的相关部分

  1. 控制器

控制器目录:application\index\controller

作用:书写业务逻辑

  1. 操作(方法)

在控制器中定义的方法

  1. 参数名/参数值

方法中的参数及参数值

例如我们要访问index模块下的Test.php控制器文件中的hello()方法。

那么可以输入http://servername/index.php/index(模块)/Test(控制器)/hello(方法)/name(参数名)/world(参数值)

还有Thinkphp的几种传参方式及差别。

PATHINFO: index.php/index/Test/hello/name/world 

只能以这种方式传参。

兼容模式:

index.php?s=index/Test/hello/name/worldindex.php?s=index/Test/hello&name=world

当我们有两个变量aa、b时,在兼容模式下还可以将两者结合传参:

index.php?s=index/Test/hello/a/1&b=2

URL解析流程

首先发起请求->开始路由检测->获取pathinfo信息->路由匹配->开始路由解析->获得模块、控制器、操作方法调度信息->开始路由调度->解析模块和类名->组建命名空间>查找并加载类->实例化控制器并调用操作方法->构建响应对象->响应输出->日志保存->程序运行结束

Q.E.D.


我用执着埋下了幼稚和任性,那片荒野慢慢长出了理性冷漠和清醒。