Просмотр файла app/Http/Middleware/CheckAccessSite.php

Размер файла: 2.72Kb
  1. <?php
  2.  
  3. namespace App\Http\Middleware;
  4.  
  5. use App\Models\Ban;
  6. use Closure;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\Cache;
  9. use Illuminate\Support\Facades\Lang;
  10. use Illuminate\Support\Facades\Route;
  11. use Illuminate\Support\Facades\View;
  12.  
  13. class CheckAccessSite
  14. {
  15. /**
  16. * Handle an incoming request.
  17. *
  18. * @param Request $request
  19. * @param Closure $next
  20. *
  21. * @return mixed
  22. */
  23. public function handle(Request $request, Closure $next)
  24. {
  25. if ($this->isBanned($request)) {
  26. return redirect('ipban');
  27. }
  28.  
  29. $this->frequencyLimit();
  30.  
  31. // Сайт закрыт для гостей
  32. if (
  33. setting('closedsite') === 1 &&
  34. ! getUser() &&
  35. ! $request->is('login', 'register', 'recovery', 'captcha')
  36. ) {
  37. setFlash('danger', __('main.not_authorized'));
  38.  
  39. return redirect('login');
  40. }
  41.  
  42. // Сайт закрыт для всех
  43. if (
  44. setting('closedsite') === 2 &&
  45. ! isAdmin() &&
  46. ! $request->is('login', 'captcha', 'closed')
  47. ) {
  48. return redirect('closed');
  49. }
  50.  
  51. $route = Route::getRoutes()->match($request);
  52. $action = explode('\\', $route->getActionName());
  53.  
  54. if ($action[0] === 'Modules') {
  55. View::addNamespace($action[1], base_path('modules/' . $action[1] . '/resources/views'));
  56. Lang::addNamespace($action[1], base_path('modules/' . $action[1] . '/resources/lang'));
  57. }
  58.  
  59. return $next($request);
  60. }
  61.  
  62. /**
  63. * Проверка на ip-бан
  64. *
  65. * @param Request $request
  66. *
  67. * @return bool
  68. */
  69. private function isBanned(Request $request): bool
  70. {
  71. $ipBan = ipBan();
  72.  
  73. return isset($ipBan[getIp()]) && ! isAdmin() && ! $request->is('ipban', 'captcha');
  74. }
  75.  
  76. /**
  77. * Ограничение частоты запросов
  78. *
  79. * @return void
  80. */
  81. private function frequencyLimit(): void
  82. {
  83. if (empty(setting('doslimit'))) {
  84. return;
  85. }
  86.  
  87. $key = 'request_' . getIp();
  88. Cache::remember($key, 60, static function () {
  89. return 0;
  90. });
  91.  
  92. $requests = Cache::increment($key);
  93.  
  94. /* Автоматическая блокировка */
  95. if ($requests > setting('doslimit')) {
  96. $ipban = Ban::query()->where('ip', getIp())->first();
  97.  
  98. if (! $ipban) {
  99. Ban::query()->insertOrIgnore([
  100. 'ip' => getIp(),
  101. 'created_at' => SITETIME,
  102. ]);
  103. }
  104.  
  105. ipBan(true);
  106. saveErrorLog(666);
  107. clearCache($key);
  108. }
  109. }
  110. }