-
背景
最近在对接某大厂,部署差不多了,但是在漏洞扫描环节有问题,前端是用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 的中间件机制还是挺不错。后续你还可以加入权限的控制之类的。如果发现博文有问题,欢迎老鸟指点一二