Safe.php 3.3 KB

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