流程分析:入口文件index.php
(1)加载应用目录
(2)加载框架启动文件
流程分析:/thinkphp/start.php启动文件
(1)加载基础文件
(2)执行应用
App::run()->send() 启动应用
(1)获取request实例
(2)初始化公共配置
在app.init()方法中,会对database.php等配置文件进行读取加载。如果有extra还会进行额外的配置加载
由于默认没有配置mpdule,所以会去下载app目录下面的php其他文件(common等等,具体看模块中写法)
最后通过Config::get()返回变量
(3)设置系统filter以及加载其他必要信息
(4)app_dispatch
(5)路由检测
https://juejin.cn/post/6844904105320644622 路由格式
-
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
模块|控制器|动作|参数|值
app::exec()
(1)通过不同的type处理不同的调度
(2)invokeMethod来进行反射调用方法和传参
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(); 注册自动加载
thinkLoader::register() 注册自动加载
https://www.cnblogs.com/jiujuan/p/8871492.html php类自动加载原理
通过类名自动加载类
加载类库映射文件(存在的话)和目录
thinkError::register(); 注册错误和异常处理机制
thinkConfig::set(include THINK_PATH . 'convention' . EXT) 加载惯例配置文件
流程分析:Loader.php
这个php里面定义了一系列后续可以调用的函数
流程简析如下
(1)启动框架的类加载机制以及变量填充,处理框架前期的数据流程处理。
(2)数据处理话完成后,对路由进行解析
(3)根据解析的路由参数,调用对应的模块控制器方法
(4)返回结果后续一些request的分析,放在后面的漏洞中。个人觉得学习php代码审计tp是个不错的练手。wordpress也可以看看
原文始发于微信公众号(e0m安全屋):th简析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论