网站屏蔽中国访问

场景:在一些业务中,我们通常不服务于国内,但是国内有同行,我们需要屏蔽国内访问,这时我们就需要屏蔽中国。当然,屏蔽其他国家也是一样的。

在这里我将屏蔽方式分为三大类的屏蔽方式:客户端屏蔽、服务端屏蔽、第三方屏蔽。必要时配合cookies、session、local storage、indexedDB、浏览器指纹、禁止F12、禁止打开控制台、打开控制台跳转等进行配合操作。

一、客户端屏蔽

这个方式主要是通过用户浏览器所处的一些环境来进行判断,将屏蔽写到js中,主要包括以下几几类:

1、时区检测

if(Intl && Intl.DateTimeFormat){
  var chinaTimeZones = [
    "Asia/Shanghai", "Asia/Harbin", "Asia/Chongqing", "Asia/Chungking",
    "Asia/Urumqi", "Asia/Hong_Kong", "Asia/Macao", "Asia/Macau",
    "Asia/Taipei", "Asia/Kashgar"
  ];
  var currentLocation = new Intl.DateTimeFormat().resolvedOptions().timeZone;
  if(currentLocation){
    if(chinaTimeZones.includes(currentLocation)){
      window.location.href = "https://www.kekc.cn/";
    }
  }
}

2、浏览器语言

const language = navigator.language || navigator.userLanguage;
if (language === 'zh-CN') {
    window.location.href = 'https://www.kekc.cn/';
}

3、User-Agent

const userAgent = navigator.userAgent;
if (userAgent.includes("Baidu") || userAgent.includes("UCWeb")) {
    window.location.href = "https://www.kekc.cn/";
}

二、服务端屏蔽

服务端屏蔽统一以PHP代码为例子,其实也可以通过Nginx等进行服务端的屏蔽,不过我这里只说代码形式吧。

1、IP屏蔽

IP屏蔽都不太可靠,可能会将你的很少很少一部分用户拒之门外,因为随着IPV6的普及,我们的ip地址连国家都可能不准确。

安装GeoIP库

composer require geoip2/geoip2

代码:

<?php
require 'vendor/autoload.php';

use GeoIp2\Database\Reader;

// 获取用户 IP 地址
function getUserIP() {
    return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
}

try {
    // 加载 GeoIP2 数据库
    $reader = new Reader('/path/to/GeoLite2-Country.mmdb'); // 替换为你的数据库路径
    $user_ip = getUserIP();

    // 获取用户国家信息
    $record = $reader->country($user_ip);
    $country_code = $record->country->isoCode;

    // 定义屏蔽的国家代码
    $blocked_countries = ['CN', 'RU', 'IR']; // 例如:屏蔽中国(CN)、俄罗斯(RU)、伊朗(IR)

    if (in_array($country_code, $blocked_countries)) {
        header("HTTP/1.1 403 Forbidden");
        echo "Access Denied. Your country ($country_code) is blocked.";
        exit();
    }

    // 正常访问内容
    echo "Welcome! Your IP: $user_ip, Country: $country_code";
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>

2、请求头语言判断

<?php
// 获取 HTTP 请求头中的语言设置
function getUserLanguage() {
    return $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
}

// 定义要屏蔽的语言列表
$blocked_languages = ['zh-CN', 'zh-TW', 'zh']; // 屏蔽简体中文和繁体中文

// 获取用户语言
$user_language = getUserLanguage();

// 检查是否包含屏蔽的语言
foreach ($blocked_languages as $blocked) {
    if (stripos($user_language, $blocked) !== false) {
        // 返回 403 状态码,并禁止访问
        header("HTTP/1.1 403 Forbidden");
        echo "Access Denied. Your language setting ($user_language) is blocked.";
        exit();
    }
}

// 正常访问内容
echo "Welcome! Your language setting: $user_language";
?>

三、第三方屏蔽

1、DNS屏蔽

一些域名解析服务支持按地区解析到不同的地方,我们可以利用这一特性,将某一个地区的DNS解析到一个打不开的地址。

2、CDN屏蔽

一些CDN厂商,支持屏蔽某些国家的操作,比如CF。

总之:为了提高屏蔽的准确性和可靠性,可以综合使用多种方法。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称常用语 夸夸
夸夸
还有吗!没看够!
表情代码图片

    暂无评论内容