首页 > 其他分享 >Ajax-hook之百度图片测试

Ajax-hook之百度图片测试

时间:2023-06-13 14:22:36浏览次数:33  
标签:function XMLHttpRequest attr xhr hook Ajax 百度 属性

/*
Ajax-hook是一种比较实用的技术,它可以自定义XMLHttpRequest中的方法和属性,
覆盖全局的XMLHttpRequest。当网站在使用Ajax请求动态渲染时,开发者可以对其中的
请求参数和响应数据进行任意修改和展示,有些类似前面讲过的本地覆盖,区别是这里
会去调用原本的XMLHttpRequest。
*/
//2.4.1 Ajax-hook源码分析
!function (ob){
     ob.hookAjax=function(funs){
     window._ahrealxhr=window._ahrealxhr||XMLHttpRequest;
     XMLHttpRequest=function(){
        /*
        查看Ajax-hook的核心代码,发现它会将浏览器window对象传入,并先获取全局的真实XMLHttpRequest,
        同时对XMLHttpRequest对象中的API接口进行遍历,其中的方法和属性会采取不同的策略进行处理。
        如果遍历到的API接口类型是function,就会用hookfun方法处理,
        属性会用Object.defineProperty方法进行定义,代码如下:
        */
            this.xhr=new window._ahrealxhr;
            for (var attr in this.xhr) {//遍历XHR接口(可枚举)
                var type="";
                try{
                        type=typeof this.xhr[attr]//获取接口类型
                    }catch(e){}
                     if (type==="function"){      //方法
                        this[attr]=hookfun(attr);  
                    }else{                        //属性
                         Object.defineProperty(this,attr,{
                         //get:在获取定义的属性时,会调用这里定义的函数。它不传入任何参数,但是会传入this对象。
                         //该函数的返回值会被用作属性的值。
                         get:getFactory(attr),
                         //set:在定义的属性被修改时,会调用这里定义的函数。该方法会接受被定义的新值作为参数,
                         //同时也会传入this对象。
                         set:setFactory(attr)
                    })
                }
            }
        };
    /*
    Ajax-hook获取属性时调用getFactory函数,返回值使用了三元运算符。this.hasOwnProperty方法会返回一个布尔值,
    用来表明this对象自身属性中是否具有指定的属性。
    */
    function getFactory(attr){
        return function(){
                 //判断this对象自身属性中是否具有指定的属性
           return this.hasOwnProperty(attr+"_")?this[attr+"_"]:this.xhr[attr];
                                                //这里通常返回以on开头的属性对应的,用户自定义的方法调用
       }
    }
    /*
    Ajax-hook运行周期内,修改属性会调用setFactory函数,它会接受被定义的新值作为参数,这里用f来指代。
    如果属性以on开头,就会在开发者自定义的func中进行匹配并调用,开发者自定义的水星返回为true表示进行阻断,
    自定义的函数执行完毕后不会再执行XHR原生函数,反之会继续执行XHR原先的回调。
    */
    function setFactory(attr){
       return function(f){
            var xhr=this.xhr;
            var that=this;
            if (attr.indexOf("on")!=0){
                //Ajax-hook在遍历的属性后加上了下划线,在setFactory中对不以on开头的属性会进行下划线添加的新映射值
                this[attr+"_"]=f;
                return;
            }
            if (funs[attr]){
                xhr[attr]=function(){
                    funs[attr](that)||f.apply(xhr,arguments);
             }
          }else{
             xhr[attr]=f;
          }
        }
    }
    //在对XMLHttpRequest中原生的方法进行处理时,会使用如下hookfun方法。
    /*
    它首先会把当前遍历来的方法中的参数赋值到args中,之后会获取开发者自定义的XMLHttpRequest方法,
    如果能够获取到开发者自定义的方法,就会对当前方法进行覆盖,并将参数传入调用:如果没有获取到,
    说明开发者没有重写这个方法,会继续调用原生方法。
    处理XMLHttpRequest属性时,主要使用Object.defineProperty,这个方法的作用是直接在一个对象上
    定义一个新的属性,或者修改一个已经存在的属性,代码如下:
    Object.defineProperty(obj,prop,descriptor)
    */
    function hookfun(fun){
        return function(){
            var args=[].slice.call(arguments);
            if (funs[fun] && funs[fun].call(this,args,this.xhr)){        
                  return;          
            }
            return this.xhr[fun].apply(this.xhr,args);
        }
    }
    return window._ahrealxhr;
}
ob.unHookAjax=function(){
    if (window._ahrealxhr) XMLHttpRequest=window._ahrealxhr;
       window._ahrealxhr=undefined;
    }
}(window);

//2.4.2 Ajax-hook拦截
/*
在使用Ajax技术的网页上,使用Ajax-hook进行代码调式会让开发者处理起来游刃有余。
XMLHttpRequest中的方法和属性都可以进行自由操作,所以能做的事也非常多,如可以
直接对网页的Ajax请求中的参数进行打印,也可以在发送Ajax请求的时候进行断点调式,
或直接将返回的响应数据进行展示,代码如下:
*/
hookAjax({
    //检测到状态码变化,打印输出响应体
    onreadystatechange:function(xhr){
        if(xhr.status==200){
            console.log("response:\n",xhr.response)
            //console.log("response")
        }
        return false;//不进行阻断
    },
    //在打开Ajax请求的时候进行操作
    open:function(arg){
         console.log("open called:\nmethod:%s,\nurl:%s,\nasync:%s\n",arg[0],arg[1],arg[2])
         //console.log("open")
    },
    //在发送Ajax请求的时候进行操作
    send:function(arg){
        debugger;//设置断点
        console.log("send called:",arg)
    },
    //在设置请求头部的时候进行操作
    setRequestHeader:function(arg){
        console.log("setRequestHearder:",arg)
    },
})
/*
百度图片(https://image.baidu.com/)的加载使用了Ajax技术,可用来做测试。将以上hook代码注入到网页中,
或直接输入Console控制中,查看Console面板的输出:
Console面板会直接输出请求图片的Ajax接口,并且打印设置的headers头部,
还展示了响应体返回的JSON图片数据。
*/

 

标签:function,XMLHttpRequest,attr,xhr,hook,Ajax,百度,属性
From: https://www.cnblogs.com/yoyo1216/p/17477381.html

相关文章

  • vue调用百度api时,跨域问题解决方案
    最近在调用百度地图,文字转语音接口的时候,用vue,js来前端实现转换,及时语音播报,遇到点问题;1.之前直接不用accessToken,一个连接拼接抓取的,已经失效了。2.查看百度文档,更新后的接口,按照文档nodejs格式,一直都是报跨域问题,单独在headers中加'Access-Control-Allow-Origin':'*'无效。......
  • 百度视频质量评测的实践之路
    视频编解码技术日新月异,新的编解码技术赋予视频业务新的应用场景和新的用户视听体验。同时,视频作为带宽消耗大户,如何在视听体验和视频带宽之间取得最优的平衡是一个永恒的话题。视频质量评测主要用来回答:体验是否改善、带宽是否合理等问题。然而,在实际中,受限于各种因素,视频质量评测......
  • 如何将word公式粘贴到百度富文本编辑器里面
    ​ 这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@     page contentType="text/html;cha......
  • 如何将word图片粘贴到百度富文本编辑器里面
    ​ 由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直接解决这个问题考虑到自己除了工作其他时间基本上不使用windows,因此打算使用nodejs来......
  • 如何将word图片粘贴到百度UEditor里面
    ​图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM.plugins['autoupload'],然后找到autoUploadHandler方法,注释掉其中的代码。加入下面的代码://判断剪贴......
  • Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析
    1、目的  在一般情况下,对于系统的常规操作如创建进程、创建互斥体、创建文件等可以进行SSDTHook进行拦截,但在x64位系统下,有PG的保护,常规的SSDTHook会导致蓝屏。但基于ObjectType的一些Hook也可以做到相应的功能且不会导致系统BSOD。 2、相关结构分析2.1XP上的相关结构......
  • 百度反链是什么? 如何查询百度反链?
    很多网站建设者都会听到“反链”这个词,但不一定知道它的具体含义和作用。反链,也叫做反向链接或者外部链接,是指其他网站指向你的网站的链接。它能够增加你的网站权重,提高搜索引擎排名和流量。那么,如何查找百度反向链接呢?下面是几种简单易行的方法:1.使用百度搜索在百度搜索框输入......
  • Python借助百度搜索引擎爬取Python小屋密切相关文章
    封面图片:《Python程序设计实验指导书》(ISBN:9787302525790),董付国,清华大学出版社=============第一步,查看本机Chrome浏览器版本。第二步,下载正确版本的Chrome浏览器驱动然后放到Python安装目录中,同时确保Python安装目录在系统环境变量Path中,下载地址为http://chromedriver.storage.go......
  • js原始坐标转百度坐标(GPS坐标转百度坐标)(火星坐标转百度坐标)
    wgs84togcj02tobd09(lng,lat){constxPI=3.14159265358979324*3000.0/180.0constPI=3.1415926535897932384626consta=6378245.0constee=0.00669342162296594323//WGS84转GCj02letdlat=transformlat(lng-105.0,lat-35.......
  • 百度随机阴影旋转验证码破解
    之前我百度没有阴影的旋转验证码,有小伙伴反馈他那里的百度验证码是有随机阴影的,原本的不带阴影的识别效果很差。所以专门针对性的做了开发识别。没有随机阴影的可以看这一篇博客《百度旋转验证码破解》识别效果可视化展示这种带随机阴影的验证码和之前没有阴影的有一点差异,特别......