也谈网站镜像攻防
近期不少博友遇到网站被恶意镜像的问题。我在 Google 没查到自己的镜像站,不过后台发现很多来源是不良网站的访问,不确定是否跟镜像站有关,因此也谈一下这个话题。
先说结论,网站被镜像易攻难守,没有完美的解决方案。前端可以拦截正常的浏览器访问,但是拦不住爬虫;后端拦不住域名伪造。目前我做了前端拦截 + 防盗链,可以将正常访客引导到主站,但是对搜索引擎爬虫没有找到办法。
接下来从攻防两个视角来分别讨论。
攻
Nginx 实现镜像
server {
listen 80;
listen 443 ssl http2;
#篡改域名
server_name dujun.us.kg;
location / {
gzip off;
proxy_set_header Accept-Encoding "";
#替换网页内容中的域名
sub_filter 'dujun.io' 'dujun.us.kg';
sub_filter_once off;
#代理原域名
proxy_pass https://dujun.io/;
}
ssl_certificate /root/.acme.sh/dujun.us.kg_ecc/dujun.us.kg.cer;
ssl_certificate_key /root/.acme.sh/dujun.us.kg_ecc/dujun.us.kg.key;
ssl_trusted_certificate /root/.acme.sh/dujun.us.kg_ecc/ca.cer;
}
Cloudflare Workers 实现镜像
创建一个 Worker,编辑代码:
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request));
});
async function fetchAndApply(request) {
const url = new URL(request.url);
url.host = 'dujun.io'; //要镜像的原始域名
const response = await fetch(url.href, request);
//可以在这里添加额外的处理逻辑,例如修改响应头等
return response;
}
然后到“设置”里面添加“自定义域”,使用镜像域名。
防
目前防御手段只对正常的浏览器访问有效。
前端拦截
JS 可以抓取浏览器地址栏的真实域名,进而拦截镜像网站。注意进行代码混淆,不要写在独立的 JS 文件里,否则很容易被内容替换导致失效。
当然,JS 拦不住搜索引擎爬虫和采集软件。
防盗链
防盗链的意义是禁止跨域访问图片、视频等资源。如果使用 CDN,一般可以在后台开启防盗链。如果未使用 CDN,经实验 Nginx 拦不住域名伪造。
同样,防盗链拦不住搜索引擎爬虫和采集软件。