|
| 1 | +--- |
| 2 | +title: "博客被恶意镜像" |
| 3 | +date: 2024-09-26T22:18:23+08:00 |
| 4 | +draft: false |
| 5 | +tags: |
| 6 | + - cloudflare |
| 7 | + - github |
| 8 | + - google |
| 9 | +--- |
| 10 | + |
| 11 | +## 起因 |
| 12 | + |
| 13 | +9月初的时候,在`Google Search Console`里发现了一个外链,域名是`**.top`。 |
| 14 | + |
| 15 | +随手点过去看了下,发现居然跟我的博客内容一模一样,就是内容变成了繁体。 |
| 16 | + |
| 17 | +知道这肯定是被拿来镜像了,不过当时也没在意,就没管。 |
| 18 | + |
| 19 | +后来在[v2ex](https://v2ex.com/t/1070859)上也发现类似的问题,还有其他博主也反馈有被镜像,感觉像是个黑产批量的操作。 |
| 20 | + |
| 21 | +这周`Google Search Console`反馈我的站点有个新问题,点进去一看,嚯。 |
| 22 | + |
| 23 | + |
| 24 | + |
| 25 | +在谷歌里搜了一下,发现已经有很多这个站点的收录了。 |
| 26 | + |
| 27 | +开始影响到我的博客收录了,这怎么能忍呢,必须处理掉它。 |
| 28 | + |
| 29 | +## 分析 |
| 30 | + |
| 31 | +测试了一下这个站点,不得不说,这个人是相当的聪明。 |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | + |
| 37 | +使用了`Cloudflare`服务,隐藏了真实的服务ip。 |
| 38 | + |
| 39 | +同时判断了访问ip,如果是国内用户直接返回了404,海外才会正常返回,这样一般国内用户就发现不了。 |
| 40 | + |
| 41 | + |
| 42 | + |
| 43 | +还重写了`robots.txt`,只让谷歌收录。 |
| 44 | + |
| 45 | +查了一下域名`Whois`信息,注册在阿里云。 |
| 46 | + |
| 47 | + |
| 48 | + |
| 49 | +页面上挂的备案号都是我的,搞事情的话后面再扯上我,这就麻烦了。 |
| 50 | + |
| 51 | +这就像块牛皮癣,越想越恶心。 |
| 52 | + |
| 53 | +我的博客搞了两套部署,一套部署在[Cloudflare Pages](https://liudon.com),一套部署在[IPFS](https://liudon.xyz)。 |
| 54 | + |
| 55 | +接下来就是搞清楚,他是镜像的哪个站点: |
| 56 | + |
| 57 | +### 1. IPFS站点 |
| 58 | + |
| 59 | +看他的`robots.txt`内容,我一开始怀疑是镜像的IPFS站点[liudon.xyz](https://liudon.xyz),感觉像是在我的`robots.txt`前面加了一段内容。 |
| 60 | + |
| 61 | +``` |
| 62 | +curl 'https://liudon.xyz/robots.txt' |
| 63 | +User-agent: * |
| 64 | +Disallow: / |
| 65 | +``` |
| 66 | + |
| 67 | +幸好还有一个`Robots meta 标记`,于是把IPFS部署的站点加上了这个属性。 |
| 68 | + |
| 69 | +部署后发现这个镜像站并没有更新,排除了这个可能。 |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | +### 2. Github 静态仓库 |
| 74 | + |
| 75 | +我在`Github`上单独搞了个分支存放生成的静态文件,`Cloudflare Pages`直接读取这个分支进行部署。 |
| 76 | + |
| 77 | +怀疑他是不是监控了这个仓库的提交记录,直接拿这个来部署的镜像站。 |
| 78 | + |
| 79 | +我把`Cloudflare Pages`的自动部署关掉,然后直接修改静态文件。 |
| 80 | + |
| 81 | +更新后发现,这个静态站并没有预期的更新。 |
| 82 | + |
| 83 | +#### 3. Cloudflare Worker |
| 84 | + |
| 85 | +在分析过程中,发现我的博客更新后,他的站点也会很快就更新。 |
| 86 | + |
| 87 | +因为他的网站部署在`Cloudflare`上,考虑是走的`Cloudflare Worker`反代,直接请求目标站点,然后进行繁体翻译返回。 |
| 88 | + |
| 89 | +这样就完全不需要关心更新的问题,完全自动化处理,太完美了。 |
| 90 | + |
| 91 | +## 反制 |
| 92 | + |
| 93 | +其实这里并没有太好的办法反制,`robots`文件被他重写了,无法控制,使用`Robots meta 标记`的话会影响到我们自己的收录。 |
| 94 | + |
| 95 | +只能是通过加一段JS代码,参考自[竹林里有冰](https://zhul.in/2024/07/18/my-blog-is-completely-proxied-and-translated-into-traditional-chinese/),判断访问的域名非法的话,直接跳转到正确地址。 |
| 96 | + |
| 97 | +``` |
| 98 | +const host = window.location.host |
| 99 | +if (host !== 'liudon.com' && ! host.startsWith('localhost') && ! host.startsWith('127.0.0.1')) { |
| 100 | + document.body.innerHTML = [ |
| 101 | + '<div style="margin: auto;">', |
| 102 | + '<h1>当前页面并非本文作者的主页,将在五秒后跳转。</h1>', |
| 103 | + '</div>', |
| 104 | + ].join('') |
| 105 | + document.body.style = [ |
| 106 | + 'background-color: white;', |
| 107 | + 'color: black;', |
| 108 | + 'text-align: center;', |
| 109 | + 'font-size: 50px;', |
| 110 | + 'width: 100vw;', |
| 111 | + 'height: 100vh;', |
| 112 | + 'display: flex;', |
| 113 | + ].join('') |
| 114 | + setTimeout(() => { |
| 115 | + window.location.href = 'https://liudon.com' |
| 116 | + }, 5000) |
| 117 | +} |
| 118 | +``` |
| 119 | + |
| 120 | +查了一下,搜索Bot爬取的时候会执行js,希望能更新掉已收录的网页信息。 |
0 commit comments