偶然发现一个设计不错的网站,心血来潮想“扒”下来看看,结果通过工具把各种文件拉到本地之后发现首页就是一个大白屏,这说明这个网站通过前端的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; // 其他代码.... });