前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不更新TP框架的情况下防止getshell漏洞

不更新TP框架的情况下防止getshell漏洞

作者头像
jwj
发布2022-05-18 11:32:25
7210
发布2022-05-18 11:32:25
举报
文章被收录于专栏:用户1069690的专栏

最近ThinkPHP框架出现了一个比较严重的漏洞,在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0.23和5.1.31之前的所有版本。 官方也很快提供了解决方案,大大的点个赞。但是只是讲了个重点,没讲太详细,对于一些新手和初学者可能不大方便操作。下面提供一些修复的方法,应该算是比较详细了。

ThinkPHP5.0

使用行为

手册:https://www.kancloud.cn/manual/thinkphp5/118130/application/tags.php文件绑定模块初始化行为

代码语言:javascript
复制
<?php
\think\Hook::add('module_init',function(){
    if (!preg_match('/^[A-Za-z](\w|\.)*$/', \think\Request::instance()->controller())) {
        throw new \think\exception\HttpException(404, 'controller not exists:' . \think\Request::instance()->controller());
    }
});

直接修改框架

打开/thinkphp/library/think/App.php,搜索获取控制器名,然后在获取控制器的代码后面加上三行代码。 下面是示例(在一些比较低的版本,控制器名的变量是$controllerName):

代码语言:javascript
复制
// 获取控制器名
$controller = strip_tags($result[1] ?: $config['default_controller']);
$controller = $convert ? strtolower($controller) : $controller;

// 获取控制器的代码后面加上下面三行代码
if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
    throw new HttpException(404, 'controller not exists:' . $controller);
}

ThinkPHP5.1

使用行为

手册:https://www.kancloud.cn/manual/thinkphp5_1/354129/application/tags.php文件绑定模块初始化行为

代码语言:javascript
复制
<?php
\think\facade\Hook::add('module_init', function () {
    if (!preg_match('/^[A-Za-z](\w|\.)*$/', \think\facade\Request::controller())) {
        throw new \think\exception\HttpException(404, 'controller not exists:' . \think\facade\Request::controller());
    }
});

使用中间件

手册:https://www.kancloud.cn/manual/thinkphp5_1/564279/config/middleware.php文件注册中间件

代码语言:javascript
复制
<?php
\think\facade\Route::middleware(function (\think\Request $request, \Closure $next) {
    if (!preg_match('/^[A-Za-z](\w|\.)*$/', $request->controller())) {
        throw new \think\exception\HttpException(404, 'controller not exists:' . $request->controller());
    }
    return $next($request);
});

直接修改框架

打开/thinkphp/library/think/route/dispatch/Url.php,搜索解析控制器,然后在解析控制器的代码后面加上三行代码。 下面是示例:

代码语言:javascript
复制
if ($this->param['auto_search']) {
    $controller = $this->autoFindController($module, $path);
} else {
    // 解析控制器
    $controller = !empty($path) ? array_shift($path) : null;
}

// 解析控制器的代码后面加上下面三行代码
if ($controller && !preg_match('/^[A-Za-z][\w|\.]*$/', $controller)) {
    throw new HttpException(404, 'controller not exists:' . $controller);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ThinkPHP5.0
    • 使用行为
      • 直接修改框架
      • ThinkPHP5.1
        • 使用行为
          • 使用中间件
            • 直接修改框架
            相关产品与服务
            消息队列 TDMQ
            消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档