最近ThinkPHP框架出现了一个比较严重的漏洞,在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0.23和5.1.31之前的所有版本。 官方也很快提供了解决方案,大大的点个赞。但是只是讲了个重点,没讲太详细,对于一些新手和初学者可能不大方便操作。下面提供一些修复的方法,应该算是比较详细了。
ThinkPHP5.0
使用行为
手册:https://www.kancloud.cn/manual/thinkphp5/118130
在/application/tags.php
文件绑定模块初始化行为
<?php
thinkHook::add('module_init',function(){
if (!preg_match('/^[A-Za-z](w|.)*$/', thinkRequest::instance()->controller())) {
throw new thinkexceptionHttpException(404, 'controller not exists:' . thinkRequest::instance()->controller());
}
});
直接修改框架
打开/thinkphp/library/think/App.php
,搜索获取控制器名
,然后在获取控制器的代码后面加上三行代码。
下面是示例(在一些比较低的版本,控制器名的变量是$controllerName
):
// 获取控制器名
$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
文件绑定模块初始化行为
<?php
thinkfacadeHook::add('module_init', function () {
if (!preg_match('/^[A-Za-z](w|.)*$/', thinkfacadeRequest::controller())) {
throw new thinkexceptionHttpException(404, 'controller not exists:' . thinkfacadeRequest::controller());
}
});
使用中间件
手册:https://www.kancloud.cn/manual/thinkphp5_1/564279
在/config/middleware.php
文件注册中间件
<?php
thinkfacadeRoute::middleware(function (thinkRequest $request, Closure $next) {
if (!preg_match('/^[A-Za-z](w|.)*$/', $request->controller())) {
throw new thinkexceptionHttpException(404, 'controller not exists:' . $request->controller());
}
return $next($request);
});
直接修改框架
打开/thinkphp/library/think/route/dispatch/Url.php
,搜索解析控制器
,然后在解析控制器的代码后面加上三行代码。
下面是示例:
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);
}