isForbidden.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Agent;
  4. use App\Utils\IP;
  5. use Closure;
  6. use Illuminate\Http\Request;
  7. use Log;
  8. use Response;
  9. class isForbidden
  10. {
  11. /**
  12. * 限制机器人、指定IP访问.
  13. *
  14. * @return mixed
  15. */
  16. public function handle(Request $request, Closure $next)
  17. { // 限制机器人、指定IP访问.
  18. // 拒绝机器人访问
  19. if (sysConfig('is_forbid_robot') && Agent::isRobot()) {
  20. Log::warning('识别到机器人('.IP::getClientIp().')访问');
  21. return Response::view('auth.error', ['message' => trans('errors.forbidden.bots')], 403);
  22. }
  23. // 拒绝通过订阅链接域名访问网站,防止网站被探测
  24. if (config('app.env') === 'production' && sysConfig('website_url') && ! str_contains(sysConfig('website_url'), $request->getHost())) {
  25. Log::warning('识别到通过订阅链接访问,强制跳转至百度('.IP::getClientIp().') '.$request->fullUrl());
  26. return redirect('https://www.baidu.com');
  27. }
  28. if (sysConfig('forbid_mode')) {
  29. $ip = IP::getClientIP();
  30. $ipLocation = IP::getIPInfo($ip);
  31. if ($ipLocation !== false) {
  32. // 拒绝无IP请求
  33. if (empty($ipLocation) || empty(array_filter($ipLocation))) {
  34. Log::warning("无法识别到IP,拒绝访问:$ip");
  35. return Response::view('auth.error', ['message' => trans('errors.forbidden.access')], 403);
  36. }
  37. if (! in_array($ipLocation['country'], ['本机地址', '局域网'])) {
  38. // 拒绝大陆IP访问
  39. switch (sysConfig('forbid_mode')) {
  40. case 'ban_mainland':
  41. if (in_array($ipLocation['country'], ['China', '中国', 'CN']) && ! in_array($ipLocation['region'], ['Taiwan', 'Hong Kong', 'Macao', '香港', '澳门', '台湾', '台湾省'])) {
  42. Log::warning("识别到大陆IP,拒绝访问:$ip");
  43. return Response::view('auth.error', ['message' => trans('errors.forbidden.china')], 403);
  44. }
  45. break;
  46. case 'ban_china':
  47. if (in_array($ipLocation['country'], ['China', '中国', 'Taiwan', 'Hong Kong', 'Macao', '香港', '台湾', '澳门'])) {
  48. Log::warning("识别到中国IP,拒绝访问:$ip");
  49. return Response::view('auth.error', ['message' => trans('errors.forbidden.china')], 403);
  50. }
  51. break;
  52. case 'ban_oversea':
  53. if (! in_array($ipLocation['country'], ['China', '中国', 'Taiwan', 'Hong Kong', 'Macao', '香港', '台湾', '澳门'])) {
  54. Log::warning("识别到海外IP,拒绝访问:$ip - ".$ipLocation['country']);
  55. return Response::view('auth.error', ['message' => trans('errors.forbidden.oversea')], 403);
  56. }
  57. break;
  58. default:
  59. Log::emergency('未知禁止访问模式!请在系统设置中修改【禁止访问模式】!');
  60. break;
  61. }
  62. }
  63. }
  64. }
  65. return $next($request);
  66. }
  67. }