背景
最近在对接某大厂,部署差不多了,但是在漏洞扫描环节有问题,前端是用vue代码写的。后端是php。发现前端路由可以拦截未登录的url。但是后端php接口不用登录就能访问,很危险解决方法
一、创建 Auth 中间件
首先创建一个专门用于验证 Session 的中间件: 里面可以放开不用登录的接口
<?php
// 目录位置 app/middleware/Auth.php
namespace app\middleware;
use think\facade\Session;
use think\Response;
class Auth
{
// 定义不需要验证的接口路径
protected $exceptPaths = [
'Auth/login', // 登录接口
'Auth/logout', // 注册接口
'Auth/getCode', // 注册接口
'Index/getTitle', // 注册接口
// 可添加更多无需验证的接口...
];
public function handle($request, \Closure $next)
{
// 获取当前请求的路径(不含域名和参数)
$path = $request->pathinfo();
// 检查是否为排除的路径
if ($this->shouldPassThrough($path)) {
return $next($request); // 跳过验证,直接继续
}
// 检查Session中是否有登录用户信息
if (!Session::has(SESSION_LOGIN_KEY)) {
// 未登录,返回JSON错误响应
return json([
'code' => 0,
'msg' => '请先登录',
'data' => 401,
'url' => null,
'wait' => 3
]);
}
// 已登录,将用户信息注入请求对象,方便后续使用
$request->user = Session::get(SESSION_LOGIN_KEY);
// 继续执行后续请求处理
return $next($request);
}
// 判断请求是否应跳过验证
protected function shouldPassThrough($path)
{
foreach ($this->exceptPaths as $except) {
if (strpos($path, $except) === 0) {
return true;
}
}
return false;
}
}
二、注册中间件
有两种方式注册中间件,根据你的需求选择:
- 全局中间件(所有请求都验证)
打开 目录位置app/middleware.php 文件,添加中间件:
// app/middleware.php
return [
// 其他中间件...
\app\middleware\Auth::class,
];
- 路由中间件(按需验证)
如果你只想验证部分接口,在路由定义中使用中间件:
// app/route/route.php
use think\facade\Route;
// 应用Auth中间件到整个Video控制器组
Route::group('video', function () {
Route::get('getIqiyiLists', 'Video/getIqiyiLists');
Route::get('getSohuLists', 'Video/getSohuLists');
// 其他接口...
})->middleware(\app\middleware\Auth::class);
// 或者只应用到特定接口
Route::get('video/getIqiyiLists', 'Video/getIqiyiLists')
->middleware(\app\middleware\Auth::class);
- 总结
大概就是这样玩的。ThinkPHP 的中间件机制还是挺不错。后续你还可以加入权限的控制之类的。如果发现博文有问题,欢迎老鸟指点一二