在查看一个网站时候,尝试本地仿站,发现首页就无法加载,通过审查元素发现页面HTML元素的body不显示,但是本地源代码可以正常显示,经验判断是网站的JS文件一定是做了什么动作,判断域名不是网站域名而不显示body,也就是不显示网页内容。
整个网站的加载就两条JS文件,一个是Jquery库文件,一个是index.min.js文件,显然对于“防盗版”的控制就在index.min.js 文件中,为了验证这个想法,初步试探,将这个文件从首页的引用中注释掉。
页面停留在这里了,说明内容的加载确实是那个文件控制,打开那个JS文件,发现有压缩,通过格式化之后,发现有很多的功能模块,通篇的搜索相关的域名未发现有内容,继续查看,看到有eval字符,说明之后的JS内容被加密了,于是将eval起始的代码做解密,解压以及解密格式化完成之后,在JS文件的末端发现了一段代码:
function authentication() { <!-- 看名称是授权方法 --> var suffix = "com", <!-- 定义一个内容是com的字符串 --> count = 1, <!-- 定义一个值是1的变量 --> dot = "."; <!-- 定义一个字符值为“.” --> var d = (count + 999).toString() + "zhu" + dot + suffix; if (window.location.host.indexOf(d) < 0) { $("body").remove(); return false } return true }
以上代码的核心部分是:
var d = (count + 999).toString() + "zhu" + dot + suffix; if (window.location.host.indexOf(d) < 0) { $("body").remove(); return false }
具体分析:
var d = (count + 999).toString() + "zhu" + dot + suffix;
1+999转化成字符串"1000",再与字符串"zhu",字符".",以及字符串"com" 串联起变成一个新的字符串"1000zhu.com"并复制给变量d
if (window.location.host.indexOf(d) < 0) $("body").remove(); return false }
判断当前访问主机域名,如果不是"1000zhu.com"开头的host地址,则把body元素移出,并返回错误值。这个思路正好与猜想的一致:不是在以"1000zhu.com"为域名的主机打开的页面浏览器就不加载页面的body元素,也就不显示页面内容。这个是一个判断方法,那么在找一下这个方法在哪里使用,经过搜索发现一段代码:
var pageIndex = 0, preloadCount = 0; var loopPlayback = false, stopSwitch = true; var videoSwiper, casesSwiper, qualitySwiper, aboutSwiper; $(function() { var m = document.location.href.toLowerCase().match(/#p(\d+)$/); if (m != null) pageIndex = m[1] - 1; if (!authentication()) return; <!-- 执行授权方法,检查一下域名 --> preload() });
显然
$(function()
表示的是页面文档加载完,应该就做点什么了,用的是Jquery语法。这段代码意思是页面加载完毕之后,执行一些初始化的语句,以及我们发现的授权检查。因此只要将这个授权检查注释忽略,即可顺利看到页面。
通过这个案例分析,我们也可以模仿其思路来保护我们自己的网站:
引用Jquery库,然后在自定义JS文件中引入授权函数方法:
$(function() { if (!authentication()) return; <!-- 执行授权方法,检查一下域名 --> });
2.在JS文件写入授权文件方法体,依据实际情况,假设域名是2015hk.com:
function authentication() { var suffix = "com", count = 5, dot = "."; var d = (count + 2010).toString() + "hongzhuang" + dot + suffix; if (window.location.host.indexOf(d) < 0) { $("body").remove(); return false } return true }