Safe.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. declare(strict_types=1);
  3. namespace app\middleware;
  4. use Closure;
  5. use think\Request;
  6. use think\Response;
  7. use think\facade\Log;
  8. use think\facade\Cache;
  9. class Safe
  10. {
  11. /**
  12. * @var array
  13. */
  14. public static $body = [];
  15. /**
  16. * @var array
  17. */
  18. public static $user = [];
  19. /**
  20. * 处理请求
  21. *
  22. * @param Request $request
  23. * @param Closure $next
  24. * @return Response
  25. */
  26. public function handle(Request $request, Closure $next)
  27. {
  28. Log::info("header:" . json_encode($_SERVER));
  29. Log::info("cookie:" . json_encode($_COOKIE));
  30. // $referer = $_SERVER['HTTP_REFERER'] ?? '';
  31. // // 非调试模式 开启referer检测
  32. // if (empty(env('app_debug'))) {
  33. // if (strpos($referer, env('weibo.referer')) === false) {
  34. // abort(
  35. // json(
  36. // [
  37. // 'code' => 403,
  38. // 'message' => 'not login.',
  39. // ]
  40. // )
  41. // );
  42. // return null;
  43. // }
  44. // }
  45. if (strpos(\think\facade\Request::url(), '/checkLogin') !== false || strpos(\think\facade\Request::url(), '/groupPageConfig') || strpos(\think\facade\Request::url(), '/notices') || strpos(\think\facade\Request::url(), '/getRule')) {
  46. return $next($request);
  47. }
  48. if (strpos(\think\facade\Request::url(), '/video') !== false) {
  49. return $next($request);
  50. }
  51. $token = $request->post('token', '');
  52. if (empty($token)) {
  53. abort(
  54. json(
  55. [
  56. 'code' => 403,
  57. 'message' => 'not login.',
  58. ]
  59. )
  60. );
  61. return null;
  62. }
  63. if (empty(Cache::get('u:' . $token))) {
  64. abort(
  65. json(
  66. [
  67. 'code' => 403,
  68. 'message' => 'token invalid.',
  69. ]
  70. )
  71. );
  72. return null;
  73. }
  74. $user = json_decode(Cache::get('u:' . $token), true);
  75. if (empty($user)) {
  76. abort(
  77. json(
  78. [
  79. 'code' => 403,
  80. 'message' => 'not login.',
  81. ]
  82. )
  83. );
  84. return null;
  85. }
  86. // 简单检查token合法性,防止抓包拿到token放到代码里面跑
  87. $loginToken = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['HTTP_ACCEPT_ENCODING'] . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . get_client_ip(0) . $user['uid']);
  88. if ($loginToken != $token) {
  89. abort(
  90. json(
  91. [
  92. 'code' => 403,
  93. 'message' => 'bad user.',
  94. ]
  95. )
  96. );
  97. return null;
  98. }
  99. static::$user = $user;
  100. $body = $request->post('body');
  101. if (!empty($body)) {
  102. $tag = $request->post('tag');
  103. if (empty($tag)) {
  104. abort(
  105. json(
  106. [
  107. 'code' => 500,
  108. 'message' => '参数错误.',
  109. ]
  110. )
  111. );
  112. return null;
  113. }
  114. $jsonText = openssl_decrypt(hex2bin($body), 'aes-256-gcm', hex2bin($user['aes_key']), 1, hex2bin($user['aes_iv']), hex2bin($tag));
  115. if (empty($jsonText)) {
  116. abort(
  117. json(
  118. [
  119. 'code' => 500,
  120. 'message' => '参数错误.',
  121. ]
  122. )
  123. );
  124. return null;
  125. }
  126. Log::info("requestBody:" . $jsonText);
  127. static::$body = json_decode($jsonText, true);
  128. return $next($request);
  129. }
  130. return $next($request);
  131. }
  132. }