场景:在一些业务中,我们通常不服务于国内,但是国内有同行,我们需要屏蔽国内访问,这时我们就需要屏蔽中国。当然,屏蔽其他国家也是一样的。
在这里我将屏蔽方式分为三大类的屏蔽方式:客户端屏蔽、服务端屏蔽、第三方屏蔽。必要时配合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
暂无评论内容