Safe.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. if (strpos(\think\facade\Request::url(), '/checkLogin') !== false) {
  23. return $next($request);
  24. }
  25. $token = $request->get('token', $request->post('token', ''));
  26. if (empty($token)) {
  27. abort(
  28. json(
  29. [
  30. 'code' => 403,
  31. 'message' => 'not login.',
  32. ]
  33. )
  34. );
  35. return null;
  36. }
  37. $user = json_decode(Cache::get('u:' . $token), true);
  38. if (empty($user)) {
  39. abort(
  40. json(
  41. [
  42. 'code' => 403,
  43. 'message' => 'not login.',
  44. ]
  45. )
  46. );
  47. return null;
  48. }
  49. // 简单检查token合法性,防止抓包拿到token放到代码里面跑
  50. $loginToken = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['HTTP_ACCEPT_ENCODING'] . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . get_client_ip(0)) . $user['uid'];
  51. if ($loginToken != $token) {
  52. abort(
  53. json(
  54. [
  55. 'code' => 403,
  56. 'message' => 'bad user.',
  57. ]
  58. )
  59. );
  60. return null;
  61. }
  62. static::$user = $user;
  63. $body = $request->post('body');
  64. if (!empty($body)) {
  65. $tag = $request->post('tag');
  66. if (empty($tag)) {
  67. abort(
  68. json(
  69. [
  70. 'code' => 500,
  71. 'message' => '参数错误.',
  72. ]
  73. )
  74. );
  75. return null;
  76. }
  77. $jsonText = openssl_decrypt(hex2bin($body), 'aes-256-gcm', hex2bin($user['aes_key']), 1, hex2bin($user['aes_iv']), hex2bin($tag));
  78. if (empty($jsonText)) {
  79. abort(
  80. json(
  81. [
  82. 'code' => 500,
  83. 'message' => '参数错误.',
  84. ]
  85. )
  86. );
  87. return null;
  88. }
  89. Log::info("requestBody:" . $jsonText);
  90. static::$body = json_decode($jsonText, true);
  91. return $next($request);
  92. }
  93. return $next($request);
  94. }
  95. }