-
背景 最近在对应某大厂,部署差不多了,但是在漏洞扫描环节有问题,前端是用vue代码写的。后端是php。发现前端路由可以拦截未登录的url。但是后端php接口不用登录就能访问,很危险
-
解决方法
一、创建 Auth 中间件 首先创建一个专门用于验证 Session 的中间件: 里面可以放开不用登录的接口
php
体验AI代码助手
代码解读
复制代码
<?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 文件,添加中间件:
php
体验AI代码助手
代码解读
复制代码
// app/middleware.php return [ // 其他中间件... \app\middleware\Auth::class, ];
- 路由中间件(按需验证) 如果你只想验证部分接口,在路由定义中使用中间件:
php
体验AI代码助手
代码解读
复制代码
// 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 的中间件机制还是挺不错。后续你还可以加入权限的控制之类的。如果发现博文有问题,欢迎老鸟指点一二