杜郎俊赏 - dujun.io

也谈网站镜像攻防

近期不少博友遇到网站被恶意镜像的问题。我在 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 拦不住域名伪造。

同样,防盗链拦不住搜索引擎爬虫和采集软件。

日期:2024-09-26