Safe.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. $referer = $_SERVER['HTTP_REFERER'] ?? '';
  29. // 非调试模式 开启referer检测
  30. if (empty(env('app_debug'))) {
  31. if (strpos($referer, env('weibo.referer')) === false) {
  32. abort(
  33. json(
  34. [
  35. 'code' => 403,
  36. 'message' => 'not login.',
  37. ]
  38. )
  39. );
  40. return null;
  41. }
  42. }
  43. 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')) {
  44. return $next($request);
  45. }
  46. if (strpos(\think\facade\Request::url(), '/video') !== false) {
  47. return $next($request);
  48. }
  49. $token = $request->post('token', '');
  50. if (empty($token)) {
  51. abort(
  52. json(
  53. [
  54. 'code' => 403,
  55. 'message' => 'not login.',
  56. ]
  57. )
  58. );
  59. return null;
  60. }
  61. if (empty(Cache::get('u:' . $token))) {
  62. abort(
  63. json(
  64. [
  65. 'code' => 403,
  66. 'message' => 'token invalid.',
  67. ]
  68. )
  69. );
  70. return null;
  71. }
  72. $user = json_decode(Cache::get('u:' . $token), true);
  73. if (empty($user)) {
  74. abort(
  75. json(
  76. [
  77. 'code' => 403,
  78. 'message' => 'not login.',
  79. ]
  80. )
  81. );
  82. return null;
  83. }
  84. // 简单检查token合法性,防止抓包拿到token放到代码里面跑
  85. $loginToken = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['HTTP_ACCEPT_ENCODING'] . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . $_SERVER['HTTP_REFERER'] . get_client_ip(0) . $user['uid']);
  86. if ($loginToken != $token) {
  87. abort(
  88. json(
  89. [
  90. 'code' => 403,
  91. 'message' => 'bad user.',
  92. ]
  93. )
  94. );
  95. return null;
  96. }
  97. static::$user = $user;
  98. $body = $request->post('body');
  99. if (!empty($body)) {
  100. $tag = $request->post('tag');
  101. if (empty($tag)) {
  102. abort(
  103. json(
  104. [
  105. 'code' => 500,
  106. 'message' => '参数错误.',
  107. ]
  108. )
  109. );
  110. return null;
  111. }
  112. $jsonText = openssl_decrypt(hex2bin($body), 'aes-256-gcm', hex2bin($user['aes_key']), 1, hex2bin($user['aes_iv']), hex2bin($tag));
  113. if (empty($jsonText)) {
  114. abort(
  115. json(
  116. [
  117. 'code' => 500,
  118. 'message' => '参数错误.',
  119. ]
  120. )
  121. );
  122. return null;
  123. }
  124. Log::info("requestBody:" . $jsonText);
  125. static::$body = json_decode($jsonText, true);
  126. return $next($request);
  127. }
  128. return $next($request);
  129. }
  130. }