ParamValidateMiddleware.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeshop100%开源免费商用商城系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | 商业版本务必购买商业授权,以免引起法律纠纷
  8. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  9. // | gitee下载:https://gitee.com/likeshop_gitee
  10. // | github下载:https://github.com/likeshop-github
  11. // | 访问官网:https://www.likeshop.cn
  12. // | 访问社区:https://home.likeshop.cn
  13. // | 访问手册:http://doc.likeshop.cn
  14. // | 微信公众号:likeshop技术社区
  15. // | likeshop团队 版权所有 拥有最终解释权
  16. // +----------------------------------------------------------------------
  17. // | author: likeshopTeam
  18. // +----------------------------------------------------------------------
  19. namespace app\openapi\http\middleware;
  20. use app\common\service\JsonService;
  21. use think\facade\App;
  22. /**
  23. * 参数验证中间件 - 防止多传参数
  24. * Class ParamValidateMiddleware
  25. * @package app\openapi\http\middleware
  26. */
  27. class ParamValidateMiddleware
  28. {
  29. /**
  30. * 参数验证处理
  31. * @param $request
  32. * @param \Closure $next
  33. * @return mixed
  34. */
  35. public function handle($request, \Closure $next)
  36. {
  37. // 获取控制器和方法
  38. $controller = $request->controller();
  39. $action = $request->action();
  40. // 构建验证器类名
  41. $validateClass = str_replace('.', '\\', App::getNamespace() . '\\openapi\\validate\\' . $controller . 'Validate');
  42. // 检查验证器是否存在
  43. if (class_exists($validateClass)) {
  44. try {
  45. $validate = new $validateClass();
  46. // 获取当前请求的所有参数
  47. $params = $request->param();
  48. // 获取验证器中定义的允许参数
  49. $allowedParams = $this->getAllowedParams($validate, $action);
  50. if (!empty($allowedParams)) {
  51. // 检查是否有多余参数
  52. $extraParams = array_diff(array_keys($params), $allowedParams);
  53. if (!empty($extraParams)) {
  54. return JsonService::fail('不允许的参数: ' . implode(', ', $extraParams), [], 400);
  55. }
  56. }
  57. } catch (\Exception $e) {
  58. // 验证器实例化失败,继续执行
  59. }
  60. }
  61. return $next($request);
  62. }
  63. /**
  64. * 获取验证器中允许的参数
  65. * @param $validate
  66. * @param string $scene
  67. * @return array
  68. */
  69. private function getAllowedParams($validate, string $scene = ''): array
  70. {
  71. $allowedParams = [];
  72. // 获取验证规则
  73. if (property_exists($validate, 'rule')) {
  74. $rules = $validate->rule ?? [];
  75. $allowedParams = array_keys($rules);
  76. }
  77. // 如果有场景验证,获取场景对应的参数
  78. if (!empty($scene) && property_exists($validate, 'scene')) {
  79. $scenes = $validate->scene ?? [];
  80. if (isset($scenes[$scene])) {
  81. $allowedParams = $scenes[$scene];
  82. }
  83. }
  84. return $allowedParams;
  85. }
  86. }