1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- <?php
- namespace App\Http\Middleware;
- use Agent;
- use App\Components\IPIP;
- use App\Components\QQWry;
- use Closure;
- use Illuminate\Http\Request;
- use Log;
- use Response;
- class isForbidden {
-
- public function handle($request, Closure $next) {
-
- if(sysConfig('is_forbid_robot') && Agent::isRobot()){
- Log::info("识别到机器人访问(".getClientIp().")");
- return Response::view('auth.error', ['message' => trans('error.ForbiddenRobot')], 403);
- }
-
- if(false !== strpos(sysConfig('subscribe_domain'), $request->getHost())
- && !str_contains(sysConfig('subscribe_domain'), sysConfig('website_url'))){
- Log::info("识别到通过订阅链接访问,强制跳转至百度(".getClientIp().")");
- return redirect('https://www.baidu.com');
- }
- $ip = getClientIP();
- if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){
- Log::info('识别到IPv6,尝试解析:'.$ip);
- $isIPv6 = true;
- $ipInfo = getIPInfo($ip);
- }else{
- $isIPv6 = false;
- $ipInfo = QQWry::ip($ip);
- if(isset($ipInfo['error'])){
- Log::info('无法识别IPv4,尝试使用IPIP的IP库解析:'.$ip);
- $ipip = IPIP::ip($ip);
- $ipInfo = [
- 'country' => $ipip['country_name'],
- 'province' => $ipip['region_name'],
- 'city' => $ipip['city_name']
- ];
- }else{
-
- $ipip = IPIP::ip($ip);
- if($ipInfo['country'] != $ipip['country_name']){
- $ipInfo['country'] = $ipip['country_name'];
- $ipInfo['province'] = $ipip['region_name'];
- $ipInfo['city'] = $ipip['city_name'];
- }
- }
- }
-
- if(empty($ipInfo) || empty($ipInfo['country'])){
- return Response::view('auth.error', ['message' => trans('error.ForbiddenAccess')], 403);
- }
- if(!in_array($ipInfo['country'], ['本机地址', '局域网'])){
-
- if(sysConfig('is_forbid_china')){
- if(($isIPv6 && $ipInfo['country'] === 'China')
- || ($ipInfo['country'] === '中国'
- && !in_array($ipInfo['province'], ['香港', '澳门', '台湾']))){
- Log::info('识别到大陆IP,拒绝访问:'.$ip);
- return Response::view('auth.error', ['message' => trans('error.ForbiddenChina')], 403);
- }
- }
-
- if(sysConfig('is_forbid_oversea')){
- if(($isIPv6 && $ipInfo['country'] !== 'China') || $ipInfo['country'] !== '中国'
- || in_array($ipInfo['province'], ['香港', '澳门', '台湾'])){
- Log::info('识别到海外IP,拒绝访问:'.$ip.' - '.$ipInfo['country']);
- return Response::view('auth.error', ['message' => trans('error.ForbiddenOversea')], 403);
- }
- }
- }
- return $next($request);
- }
- }
|