isForbidden.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Components\Helpers;
  4. use App\Components\QQWry;
  5. use Agent;
  6. use Log;
  7. use Closure;
  8. class isForbidden
  9. {
  10. /**
  11. * 限制机器人、指定IP访问
  12. *
  13. * @param \Illuminate\Http\Request $request
  14. * @param \Closure $next
  15. *
  16. * @return mixed
  17. */
  18. public function handle($request, Closure $next)
  19. {
  20. // 拒绝机器人访问
  21. if (Helpers::systemConfig()['is_forbid_robot']) {
  22. if (Agent::isRobot()) {
  23. Log::info("识别到机器人访问(" . getClientIp() . ")");
  24. return response()->view('error.403', [], 403);
  25. }
  26. }
  27. $isIPv6 = false;
  28. $ip = getClientIP();
  29. $qqWry = new QQWry();
  30. $ipInfo = $qqWry->ip($ip);
  31. if (isset($ipInfo['error'])) {
  32. $isIPv6 = true;
  33. Log::info('无法识别IP,可能是IPv6,尝试解析:' . $ip);
  34. $ipInfo = getIPv6($ip);
  35. }
  36. // 拒绝无IP请求
  37. if (empty($ipInfo) || empty($ipInfo['country'])) {
  38. return response()->view('error.403', [], 403);
  39. }
  40. if (!in_array($ipInfo['country'], ['本机地址', '局域网'])) {
  41. // 拒绝大陆IP访问
  42. if (Helpers::systemConfig()['is_forbid_china']) {
  43. if (($ipInfo['country'] == '中国' && !in_array($ipInfo['province'], ['香港', '澳门', '台湾'])) || ($isIPv6 && $ipInfo['country'] == 'China')) {
  44. Log::info('识别到大陆IP,拒绝访问:' . $ip);
  45. return response()->view('error.403', [], 403);
  46. }
  47. }
  48. // 拒绝非大陆IP访问
  49. if (Helpers::systemConfig()['is_forbid_oversea']) {
  50. if ($ipInfo['country'] != '中国' || in_array($ipInfo['province'], ['香港', '澳门', '台湾']) || ($isIPv6 && $ipInfo['country'] != 'China')) {
  51. Log::info('识别到海外IP,拒绝访问:' . $ip . ' - ' . $ipInfo['country']);
  52. return response()->view('error.403', [], 403);
  53. }
  54. }
  55. }
  56. return $next($request);
  57. }
  58. }