javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > 重写JS setTimeout

重写JS setTimeout 方法 JavaScript Hook 劫持setTimeout

作者:psonh

想要重写  setTimeout  方法,发现有动态引入的js,需要改成自己的js,以下教教大家这个需求,防止网站被劫持

一、重新定义setTimeout方法

直接上代码和注释:

//定义 _setTimeout 接收 setTimeout
var _setTimeout = window.setTimeout;
// 重写setTimeout 
window.setTimeout = function(ref, tm){
        code = '' + ref;//把方法tostring
        //判断内容有包含这个链接,可以直接方法
        if(code.indexOf('www.jsjiami.com/main.js') !== -1){
            ref = function () {
                 //我把它改成想改成其他的js
                var script = document.createElement("script");
                script.setAttribute("src","https://www.baidu.com/main.js");
                var s = document.getElementsByTagName("script")[0];
                s.parentNode.insertBefore(script, s);
                console.log('被劫持了哦1');
            }
        }
        //判断内容有包含这个方法
        if(code.indexOf('method') !== -1){
            ref = function () {
               console.log('被劫持了哦2');
               return ;
            }
        }
    	var argu = Array.prototype.slice.call(arguments,2);
        var f = function(){
        	ref.apply(null, argu);
        };
        return _setTimeout(f, tm);
}

应该看得明白吧,配合注释看。

比如如下的代码

setTimeout(function () {
    //比如我要劫持这个引入js
    var script = document.createElement("script");
    script.setAttribute("src","https://www.jsjiami.com/main.js");
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(script, s);
},100);

效果图

直接请求百度了。

方法劫持我就不演示了。

当然我们也可以直接加载一个php页面返回当期的网址,就知道哪个网站出现了劫持情况,及时排查解决。

阅读全文