chaihongjun.me

保护网站不被仿站禁止本地加载

偶然发现一个设计不错的网站,心血来潮想“扒”下来看看,结果通过工具把各种文件拉到本地之后发现首页就是一个大白屏,这说明这个网站通过前端的javascript做了一定的"防盗版"措施,逻辑应该是发现网站在本地二不是通过线上域名请求的,于是中断了各种请求下载和页面渲染工作。

整个网站就2个javascript文件,一个是jquery,那么蹊跷肯定出在另外一个javascript文件里。为了验证,于是本地禁用了另外一个javascript文件,并刷新网站首页,发现首页加载到一定阶段就暂停了,说目确实是另外一个文件在做检查工作,进一步在另外一个javascript文件中查看发现了`eval`字样,说明有代码加密混淆的情况,于是把eval起始的包裹的代码做解密美化,工具地址:http://jinmiyun.cn/endecodejs/。

再分析解密之后的文件内容,发现一端特殊的代码:

function authentication() {    
        var suffix = "com",
        count = 1,
        dot = ".";    
        var d = (count + 999).toString() + "zhu" + dot + suffix;    
        if (window.location.host.indexOf(d) < 0 && window.location.host.indexOf("qianzhu.cn") < 0)
         {
                $("body").remove();       
                return false;
         }    
               return true;
      }

这个函数判断域名如果不符合某个规则,那么久直接删除html的body元素,因为也就看不到页面的内容了。再看一下这个函数是在这段代码调用:

$(function() {
    var m = document.location.href.toLowerCase().match(/#p(\d+)$/); #code1
    if (m != null) pageIndex = m[1] - 1; #code2
    if (!authentication()) return;
    preload()
});

这段代码大致也是页面加载之初就开始判断了。code1和code2这两段代码的目的是从当前页面的URL中解析出紧跟在#p后面的数字,并将这个数字减去1后存储在pageIndex变量中。这种技术常用于单页应用(SPA)中,通过URL的哈希值来控制页面内容或状态的显示,例如,在分页显示内容时,通过改变URL的哈希值来指示当前显示的页码。

所以,我们也可以模仿这段代码写出自己的保护代码:

// 函数声明
// 域名的写法可以更绕一点
function authentication() {    
        var suffix = "me",
        dot = ".";    
        var d = "chai" + "hong"+"jun" + dot + suffix;    
        if (window.location.host.indexOf(d) < 0)
         {
                $("body").remove();       
                return false;
         }    
               return true;
      }
      
//函数调用
 $(function() {
    if (!authentication()) return;
  // 其他代码....
});

 

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»