th简析

admin 2024年6月18日12:34:00评论1 views字数 3350阅读11分10秒阅读模式

流程分析:入口文件index.php

th简析

(1)加载应用目录
(2)加载框架启动文件

流程分析:/thinkphp/start.php启动文件

th简析

(1)加载基础文件
(2)执行应用

App::run()->send() 启动应用

(1)获取request实例

th简析

(2)初始化公共配置

在app.init()方法中,会对database.php等配置文件进行读取加载。如果有extra还会进行额外的配置加载

th简析

由于默认没有配置mpdule,所以会去下载app目录下面的php其他文件(common等等,具体看模块中写法)

th简析

最后通过Config::get()返回变量

th简析

(3)设置系统filter以及加载其他必要信息

th简析

(4)app_dispatch

th简析

(5)路由检测

https://juejin.cn/post/6844904105320644622 路由格式

th简析

  1. Route::check()
public static function check($request, $url, $depr = '/', $checkDomain = false){        //检查解析缓存        if (!App::$debug && Config::get('route_check_cache')) {            $key = self::getCheckCacheKey($request);            if (Cache::has($key)) {                list($rule, $route, $pathinfo, $option, $matches) = Cache::get($key);                return self::parseRule($rule, $route, $pathinfo, $option, $matches, true);            }        }        // 分隔符替换 确保路由定义使用统一的分隔符        $url = str_replace($depr, '|', $url);        if (isset(self::$rules['alias'][$url]) || isset(self::$rules['alias'][strstr($url, '|', true)])) {            // 检测路由别名            $result = self::checkRouteAlias($request, $url, $depr);            if (false !== $result) {                return $result;            }        }        $method = strtolower($request->method());        // 获取当前请求类型的路由规则        $rules = isset(self::$rules[$method]) ? self::$rules[$method] : [];        // 检测域名部署        if ($checkDomain) {            self::checkDomain($request, $rules, $method);        }        // 检测URL绑定        $return = self::checkUrlBind($url, $rules, $depr);        if (false !== $return) {            return $return;        }        if ('|' != $url) {            $url = rtrim($url, '|');        }        $item = str_replace('|', '/', $url);        if (isset($rules[$item])) {            // 静态路由规则检测            $rule = $rules[$item];            if (true === $rule) {                $rule = self::getRouteExpress($item);            }            if (!empty($rule['route']) && self::checkOption($rule['option'], $request)) {                self::setOption($rule['option']);                return self::parseRule($item, $rule['route'], $url, $rule['option']);            }        }        // 路由规则检测        if (!empty($rules)) {            return self::checkRoute($request, $rules, $url, $depr);        }        return false;    }

tp的多种路由格式,对应不同的路由检测,不过流程如下1)获取路由path和路径分割符2)读取路由缓存和配置的路由文件后导入路由3)调用Route::check    1.检查缓存&&分割路由&&检查别名    2.获取请求类型以及之前配置的请求的路由规则(route.check())    3.没有路由定义等,会调用Route::parseUrl($path, $depr, $config['controller_auto_search']解析路由

看看路由解析

index|article|index|article_id|5

模块|控制器|动作|参数|值

th简析

app::exec()

(1)通过不同的type处理不同的调度
(2)invokeMethod来进行反射调用方法和传参

th简析

protected static function exec($dispatch, $config){        switch ($dispatch['type']) {            case 'redirect': // 重定向跳转                $data = Response::create($dispatch['url'], 'redirect')                    ->code($dispatch['status']);                break;            case 'module': // 模块/控制器/操作                $data = self::module(                    $dispatch['module'],                    $config,                    isset($dispatch['convert']) ? $dispatch['convert'] : null                );                break;            case 'controller': // 执行控制器操作                $vars = array_merge(Request::instance()->param(), $dispatch['var']);                $data = Loader::action(                    $dispatch['controller'],                    $vars,                    $config['url_controller_layer'],                    $config['controller_suffix']                );                break;            case 'method': // 回调方法                $vars = array_merge(Request::instance()->param(), $dispatch['var']);                $data = self::invokeMethod($dispatch['method'], $vars);                break;            case 'function': // 闭包                $data = self::invokeFunction($dispatch['function']);                break;            case 'response': // Response 实例                $data = $dispatch['response'];                break;            default:                throw new InvalidArgumentException('dispatch type not support');        }        return $data;    }

流程分析:/base.php基础文件

(1)定义了一系列tp的变量
(2)包含了一些框架基础处理的类
(3)thinkLoader::register(); 注册自动加载

th简析

thinkLoader::register()  注册自动加载https://www.cnblogs.com/jiujuan/p/8871492.html php类自动加载原理

th简析

通过类名自动加载类

th简析

加载类库映射文件(存在的话)和目录

th简析

thinkError::register(); 注册错误和异常处理机制

th简析

thinkConfig::set(include THINK_PATH . 'convention' . EXT)  加载惯例配置文件

th简析

th简析

流程分析:Loader.php

这个php里面定义了一系列后续可以调用的函数

th简析

流程简析如下

(1)启动框架的类加载机制以及变量填充,处理框架前期的数据流程处理。
(2)数据处理话完成后,对路由进行解析
(3)根据解析的路由参数,调用对应的模块控制器方法
(4)返回结果

后续一些request的分析,放在后面的漏洞中。个人觉得学习php代码审计tp是个不错的练手。wordpress也可以看看

原文始发于微信公众号(e0m安全屋):th简析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月18日12:34:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   th简析https://cn-sec.com/archives/2860108.html

发表评论

匿名网友 填写信息