什么是网站镜像?

网站镜像是指在互联网上出现一个与你的网站几乎一模一样的复制品,除了域名不同之外,其它所有内容都完全相同。这包括网站的布局、LOGO、版块结构等。

通常,网站被恶意镜像的情况主要有两种:

  • 完全镜像:这种情况是创建一个与您网站内容完全相同的站点,除了网址不同,其他一切都模仿您的设计和内容。
  • 内容抓取:这种情况常见于博彩网站,它们会恶意抓取您的网页内容,正常浏览时隐藏掉原有内容,显示的却是他们自己的广告。

20240824212126440

在上述例子中,明显属于第一种情况:对方镜像了我的网站布局和结构。这种行为属于灰色 SEO 和黑帽 SEO 手法,目的是为了借助我博客的权重和流量来提升他们自己网站的排名。 20240824212126441

网站被镜像危害

从搜索引擎来讲,会对搜索引擎抓取不利,影响原本网站的正常抓取和识别,可能会导致原网站权重丢失,也有可能带来一定的误伤,搜索引擎会对网站进行识别,如果发现是镜像站,会导致网站被搜索引擎屏蔽,将失去搜索引擎带来的流量(这对个人博客来说是致命的)。

对用户来讲,可能会被镜像网站欺骗,恶意广告插播或欺诈内容造成用户损失。

网站被镜像了怎么办

添加防镜像跳转代码

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>not mirroring</title>
<style>
    .alert-message {
        position: fixed;
        top: 45%;
        left: 50%;
        transform: translate(-50%, -50%);
        background-color: #f8d7da;
        color: #721c24;
        padding: 20px;
        z-index: 10000;
        opacity: 1;
        transition: opacity 3s;
        border-radius:16px;
    }
    .alert-message.fade-out {
        opacity: 0;
    }
</style>
</head>
<body>

<script>
(function () {
    // 定义合法域名列表并Base64编码
    var validDomains = ['Z29ycGVsbi50b3A=']; // gorpeln.top
    var redirectUrl = 'aHR0cHM6Ly9nb3JwZWxuLnRvcA=='; // https://gorpeln.top
    var hostname = document.location.hostname + (document.location.port ? ':' + document.location.port : '');

    function createWatermark(text) {
        var watermarkDiv = document.createElement('div');
        watermarkDiv.style.pointerEvents = 'none';
        watermarkDiv.style.position = 'fixed';
        watermarkDiv.style.top = '0';
        watermarkDiv.style.left = '-5%';
        watermarkDiv.style.width = '110%';
        watermarkDiv.style.height = '100%';
        watermarkDiv.style.zIndex = '9999';
        watermarkDiv.style.opacity = '0.1';
        watermarkDiv.style.background = 'transparent';
        watermarkDiv.style.overflow = 'hidden';
        watermarkDiv.style.display = 'flex';
        watermarkDiv.style.justifyContent = 'center';
        watermarkDiv.style.alignItems = 'center';
        watermarkDiv.style.flexWrap = 'wrap';

        var watermarkText = document.createElement('div');
        watermarkText.innerText = text;
        watermarkText.style.color = 'black';
        watermarkText.style.fontSize = '30px';
        watermarkText.style.transform = 'rotate(-30deg)';
        watermarkText.style.whiteSpace = 'nowrap';
        watermarkText.style.margin = '80px';

        for (var i = 0; i < 100; i++) {
            watermarkDiv.appendChild(watermarkText.cloneNode(true));
        }

        document.body.appendChild(watermarkDiv);
    }

    function showAlertMessage(message) {
        var alertMessage = document.createElement('div');
        alertMessage.className = 'alert-message';
        alertMessage.innerText = message;

        document.body.appendChild(alertMessage);

        // 3秒后添加fade-out类,使消息淡出
        setTimeout(function() {
            alertMessage.classList.add('fade-out');

            // 再等1秒(总共4秒)后删除元素
            setTimeout(function() {
                if (alertMessage.parentNode) {
                    alertMessage.parentNode.removeChild(alertMessage);
                }
            }, 200);
        }, 3000);

        // 5秒后跳转
        setTimeout(function() {
            window.location.replace(atob(redirectUrl));
        }, 5000);
    }

    // 检查当前域名是否在合法域名列表中
    if (!validDomains.includes(btoa(hostname))) {
        createWatermark(atob(validDomains[0])); // 使用合法域名列表中的第一个元素 
        showAlertMessage("警告:你当前浏览的页面非官方页面,可能存在有害信息!将在5秒后为你跳转至官方页面进行浏览!");
    }
})();
</script>
</body>
</html>

代码目的

这个代码的目的是,利用对方会无脑反代一切内容的机制,在所有页面内都插入检测 JS 代码,在网友访问时,检测当前域名是否为所设定自己博客的域名,如果不是所设定的博客域名则在网站背景中嵌入带域名水印并使用 confirm() 打断页面渲染,并弹出弹窗警示用户自动跳转回源站。 并且使用 JavaScript 动态插入水印 div 并不设置 id,class 等标识,防止对方通过u正则表达式匹配删除特定 div 元素。

代码升级

因为 JavaScript 仍然是以明文方式暴露在 HTML 中,有正则表达式匹配风险,所以如果对方使用正则表达式破坏水印 JavaScript,则会导致水印无法正常显示。反制方法也很简单:使用 JavaScript 混淆。

这里推荐一个 GitHub 上一个项目:https://github.com/javascript-obfuscator/javascript-obfuscator,该项目可以对 JavaScript 进行混淆,官方也提供了一个在线工具:https://obfuscator.io/#code

我们可以借此对水印部分的 JavaScript 进行混淆,防止对水印 JavaScript 部分进行正则表达式匹配破坏,上面代码经过中等级混淆后如下:

function _0x1244(_0x2e9cd0,_0x16f71d){var _0x2ccdb5=_0x2ccd();return _0x1244=function(_0x124436,_0x222862){_0x124436=_0x124436-0x1d3;var _0x36d7fe=_0x2ccdb5[_0x124436];return _0x36d7fe;},_0x1244(_0x2e9cd0,_0x16f71d);}function _0x2ccd(){var _0x519334=['4159181SScBxf','center','110%','pointerEvents','80px','left','fixed','parentNode','117310NCrasO','width','33428dRtpro','wrap','hostname','fade-out','background','flex','30px','85638ogEylA','none','black','0.1','flexWrap','location','opacity','transform','10FNisEK','whiteSpace','position','body','100%','createElement','rotate(-30deg)','port','transparent','hidden','36vpXQzg','1078040hBJRkh','overflow','4510488GmCyEv','display','div','1243HhykLg','294OWGOMk','alert-message','-5%','margin','cloneNode','justifyContent','appendChild','alignItems','fontSize','zIndex','警告:你当前浏览的页面非官方页面,可能存在有害信息!将在5秒后为你跳转至官方页面进行浏览!','add','4592382EinlGm','36cjOBwx','innerText','removeChild','5neLlLf','style','includes'];_0x2ccd=function(){return _0x519334;};return _0x2ccd();}(function(_0x4df09c,_0x8f741a){var _0x8f2856=_0x1244,_0x22b1d8=_0x4df09c();while(!![]){try{var _0x5f3be6=-parseInt(_0x8f2856(0x1f2))/0x1*(parseInt(_0x8f2856(0x201))/0x2)+-parseInt(_0x8f2856(0x1e1))/0x3+-parseInt(_0x8f2856(0x20e))/0x4*(-parseInt(_0x8f2856(0x1e5))/0x5)+-parseInt(_0x8f2856(0x1f9))/0x6*(-parseInt(_0x8f2856(0x1d5))/0x7)+-parseInt(_0x8f2856(0x20c))/0x8*(-parseInt(_0x8f2856(0x20b))/0x9)+parseInt(_0x8f2856(0x1f0))/0xa*(parseInt(_0x8f2856(0x1d4))/0xb)+parseInt(_0x8f2856(0x1e2))/0xc*(-parseInt(_0x8f2856(0x1e8))/0xd);if(_0x5f3be6===_0x8f741a)break;else _0x22b1d8['push'](_0x22b1d8['shift']());}catch(_0x3801aa){_0x22b1d8['push'](_0x22b1d8['shift']());}}}(_0x2ccd,0xe404e),(function(){var _0x2a9a37=_0x1244,_0x3507a2=['Z29ycGVsbi50b3A='],_0x49805e='aHR0cHM6Ly9nb3JwZWxuLnRvcA==',_0x2e6736=document['location'][_0x2a9a37(0x1f4)]+(document[_0x2a9a37(0x1fe)][_0x2a9a37(0x208)]?':'+document['location']['port']:'');function _0xc49f33(_0x38600e){var _0x202c5e=_0x2a9a37,_0x2660f1=document['createElement']('div');_0x2660f1['style'][_0x202c5e(0x1eb)]=_0x202c5e(0x1fa),_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x203)]=_0x202c5e(0x1ee),_0x2660f1['style']['top']='0',_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x1ed)]=_0x202c5e(0x1d7),_0x2660f1['style'][_0x202c5e(0x1f1)]=_0x202c5e(0x1ea),_0x2660f1['style']['height']=_0x202c5e(0x205),_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x1de)]='9999',_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x1ff)]=_0x202c5e(0x1fc),_0x2660f1['style'][_0x202c5e(0x1f6)]=_0x202c5e(0x209),_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x20d)]=_0x202c5e(0x20a),_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x20f)]=_0x202c5e(0x1f7),_0x2660f1['style'][_0x202c5e(0x1da)]=_0x202c5e(0x1e9),_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x1dc)]=_0x202c5e(0x1e9),_0x2660f1[_0x202c5e(0x1e6)][_0x202c5e(0x1fd)]=_0x202c5e(0x1f3);var _0x323b98=document[_0x202c5e(0x206)](_0x202c5e(0x1d3));_0x323b98[_0x202c5e(0x1e3)]=_0x38600e,_0x323b98[_0x202c5e(0x1e6)]['color']=_0x202c5e(0x1fb),_0x323b98[_0x202c5e(0x1e6)][_0x202c5e(0x1dd)]=_0x202c5e(0x1f8),_0x323b98[_0x202c5e(0x1e6)][_0x202c5e(0x200)]=_0x202c5e(0x207),_0x323b98['style'][_0x202c5e(0x202)]='nowrap',_0x323b98[_0x202c5e(0x1e6)][_0x202c5e(0x1d8)]=_0x202c5e(0x1ec);for(var _0x17c22c=0x0;_0x17c22c<0x64;_0x17c22c++){_0x2660f1[_0x202c5e(0x1db)](_0x323b98[_0x202c5e(0x1d9)](!![]));}document[_0x202c5e(0x204)][_0x202c5e(0x1db)](_0x2660f1);}function _0x1aa9d7(_0x4e583e){var _0x37bf9d=_0x2a9a37,_0x4d1163=document[_0x37bf9d(0x206)]('div');_0x4d1163['className']=_0x37bf9d(0x1d6),_0x4d1163[_0x37bf9d(0x1e3)]=_0x4e583e,document[_0x37bf9d(0x204)][_0x37bf9d(0x1db)](_0x4d1163),setTimeout(function(){var _0x3d022c=_0x37bf9d;_0x4d1163['classList'][_0x3d022c(0x1e0)](_0x3d022c(0x1f5)),setTimeout(function(){var _0x68fa28=_0x3d022c;_0x4d1163[_0x68fa28(0x1ef)]&&_0x4d1163[_0x68fa28(0x1ef)][_0x68fa28(0x1e4)](_0x4d1163);},0xc8);},0xbb8),setTimeout(function(){var _0x528155=_0x37bf9d;window[_0x528155(0x1fe)]['replace'](atob(_0x49805e));},0x1388);}!_0x3507a2[_0x2a9a37(0x1e7)](btoa(_0x2e6736))&&(_0xc49f33(atob(_0x3507a2[0x0])),_0x1aa9d7(_0x2a9a37(0x1df)));}()));

效果示意

20240824212126442

其他方法

1、向 google、域名注册商 、域名解析商举报

  • cloudflare 举报:https://abuse.cloudflare.com/dmca
  • google 举报:https://support.google.com/legal/answer/3110420?visit_id=638624243885343005-291301472&rd=1
  • 阿里云举报:https://report.aliyun.com/form/phishingForm

2、设置 IP 黑名单

  • 进入自己的服务器设置或者是虚拟主机管理,找到防火墙有的叫黑名单,把对方的 IP 地址添加进行,屏蔽访问和请求自己网站服务器

3、向谷歌申请移除镜像站的搜索结果

  • 因为它会原样照搬反代网页,那其实你可以通过HTML 标记验证方式在 Google Search Console 里把他的反代域名也认证到你自己名下,然后在Google Search Console 向谷歌申请移除搜索结果,嘿嘿😋