Safe.php 3.8 KB

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