AutoBanSubscribeJob.php 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use App\Http\Models\Config;
  5. use App\Http\Models\UserSubscribe;
  6. use App\Http\Models\UserSubscribeLog;
  7. use Log;
  8. class AutoBanSubscribeJob extends Command
  9. {
  10. protected $signature = 'autoBanSubscribeJob';
  11. protected $description = '自动封禁异常订阅链接';
  12. public function __construct()
  13. {
  14. parent::__construct();
  15. }
  16. public function handle()
  17. {
  18. /*
  19. * 客户端请求头有多种,常见如下:
  20. * SSR、SSRR安卓客户端:
  21. * okhttp/3.8.0
  22. * Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; MX4 Pro Build/KTU84P) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
  23. *
  24. * Shadowrocket:
  25. * Shadowrocket/516 CFNetwork/893.14.2 Darwin/17.3.0
  26. * Shadowrocket/510 CFNetwork/893.14.2 Darwin/17.3.0
  27. * Shadowrocket/510 CFNetwork/889.9 Darwin/17.2.0
  28. * Shadowrocket/510 CFNetwork/811.5.4 Darwin/16.7.0
  29. * Shadowrocket/510 CFNetwork/811.5.4 Darwin/16.6.0
  30. * Shadowrocket/510 CFNetwork/808.0.2 Darwin/16.0.0
  31. * Shadowrocket/510 CFNetwork/758.4.3 Darwin/15.5.0
  32. * Shadowrocket/510 CFNetwork/897.15 Darwin/17.5.0
  33. * Shadowrocket/2.1.11 (iPhone; iOS 10.3.3; Scale/3.00)
  34. * Shadowrocket/2.1.10 (iPhone; iOS 11.1.2; Scale/2.00)
  35. * Shadowrocket/2.1.12 (iPhone; iOS 10.3.2; Scale/3.00)
  36. * Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H143 Safari/600.1.4
  37. * ShadowsocksR win版:
  38. * Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36
  39. * Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
  40. * Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
  41. * 梅林固件:
  42. * curl/7.21.7 (arm-unknown-linux-gnu) libcurl/7.54.1 OpenSSL/1.0.2n zlib/1.2.5
  43. * curl/7.21.7 (arm-unknown-linux-gnu) libcurl/7.54.1 OpenSSL/1.0.2l zlib/1.2.5
  44. * curl/7.59.0
  45. * curl/7.60.0
  46. * curl/7.37.1
  47. * Mac SSR:
  48. * ShadowsocksX-NG-R
  49. * ShadowsocksX-NG-R 1.4.1-R8 Version 4
  50. * ShadowsocksX-NG-R 1.4.3-R8 Version 2
  51. * ShadowsocksX-NG-R 1.4.3-R8 Version 3
  52. * Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
  53. * Mozilla/5.0 (Linux; Android 8.0.0; BLA-AL00 Build/HUAWEIBLA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36 MicroMessenger/6.6.1.1220(0x26060135) NetType/4G Language/zh_CN
  54. * 带Cloudflare CDN:Cf-Connecting-Ip Cf-Ray Cf-Visitor
  55. */
  56. $config = $this->systemConfig();
  57. // 封禁24小时访问异常的订阅链接
  58. if ($config['is_subscribe_ban']) {
  59. $subscribeList = UserSubscribe::query()->where('status', 1)->get();
  60. if (!$subscribeList->isEmpty()) {
  61. foreach ($subscribeList as $subscribe) {
  62. // 24小时内不同IP的请求次数
  63. $request_times = UserSubscribeLog::query()->where('sid', $subscribe->id)->where('request_time', '>=', date("Y-m-d H:i:s", strtotime("-24 hours")))->distinct('request_ip')->count('request_ip');
  64. if ($request_times >= $config['subscribe_ban_times']) {
  65. UserSubscribe::query()->where('id', $subscribe->id)->update(['status' => 0, 'ban_time' => time(), 'ban_desc' => '存在异常,自动封禁']);
  66. }
  67. }
  68. }
  69. }
  70. Log::info('定时任务:' . $this->description);
  71. }
  72. // 系统配置
  73. private function systemConfig() {
  74. $config = Config::query()->get();
  75. $data = [];
  76. foreach ($config as $vo) {
  77. $data[$vo->name] = $vo->value;
  78. }
  79. return $data;
  80. }
  81. }