| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- <?php
- // +----------------------------------------------------------------------
- // | likeshop100%开源免费商用商城系统
- // +----------------------------------------------------------------------
- // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
- // | 开源版本可自由商用,可去除界面版权logo
- // | 商业版本务必购买商业授权,以免引起法律纠纷
- // | 禁止对系统程序代码以任何目的,任何形式的再发布
- // | gitee下载:https://gitee.com/likeshop_gitee
- // | github下载:https://github.com/likeshop-github
- // | 访问官网:https://www.likeshop.cn
- // | 访问社区:https://home.likeshop.cn
- // | 访问手册:http://doc.likeshop.cn
- // | 微信公众号:likeshop技术社区
- // | likeshop团队 版权所有 拥有最终解释权
- // +----------------------------------------------------------------------
- // | author: likeshopTeam
- // +----------------------------------------------------------------------
- namespace app\openapi\http\middleware;
- use app\common\service\JsonService;
- use think\facade\App;
- /**
- * 参数验证中间件 - 防止多传参数
- * Class ParamValidateMiddleware
- * @package app\openapi\http\middleware
- */
- class ParamValidateMiddleware
- {
- /**
- * 参数验证处理
- * @param $request
- * @param \Closure $next
- * @return mixed
- */
- public function handle($request, \Closure $next)
- {
- // 获取控制器和方法
- $controller = $request->controller();
- $action = $request->action();
-
- // 构建验证器类名
- $validateClass = str_replace('.', '\\', App::getNamespace() . '\\openapi\\validate\\' . $controller . 'Validate');
-
- // 检查验证器是否存在
- if (class_exists($validateClass)) {
- try {
- $validate = new $validateClass();
-
- // 获取当前请求的所有参数
- $params = $request->param();
-
- // 获取验证器中定义的允许参数
- $allowedParams = $this->getAllowedParams($validate, $action);
-
- if (!empty($allowedParams)) {
- // 检查是否有多余参数
- $extraParams = array_diff(array_keys($params), $allowedParams);
-
- if (!empty($extraParams)) {
- return JsonService::fail('不允许的参数: ' . implode(', ', $extraParams), [], 400);
- }
- }
- } catch (\Exception $e) {
- // 验证器实例化失败,继续执行
- }
- }
-
- return $next($request);
- }
-
- /**
- * 获取验证器中允许的参数
- * @param $validate
- * @param string $scene
- * @return array
- */
- private function getAllowedParams($validate, string $scene = ''): array
- {
- $allowedParams = [];
-
- // 获取验证规则
- if (property_exists($validate, 'rule')) {
- $rules = $validate->rule ?? [];
- $allowedParams = array_keys($rules);
- }
-
- // 如果有场景验证,获取场景对应的参数
- if (!empty($scene) && property_exists($validate, 'scene')) {
- $scenes = $validate->scene ?? [];
- if (isset($scenes[$scene])) {
- $allowedParams = $scenes[$scene];
- }
- }
-
- return $allowedParams;
- }
- }
|