前端网络之:抓包,数据拦截,请求修改

浏览器请求拦截

window.XMLHttpRequest 对象的重写

  1. 拦截请求入参(通过修改 send 方法修改)
class XMLHttpRequestInter extends window.XMLHttpRequest {
    constructor(...args) {
        super(...args);
    }
    send(...params) {
        const yourParams = [] // 你的参数处理逻辑
        // 发送你的参数
        super.send(...yourParams);
    }
}
window.XMLHttpRequest = XMLHttpRequestInter;
  1. 拦截请求回来的数据
class XMLHttpRequestInter extends window.XMLHttpRequest {
    constructor(...args) {
        super(...args);
    }
    open(...params) {
        // 获取到请求url
        const url = params[1];
        // 你的判断逻辑
        ...
        // 满足条件修改返回数据
        if (条件 === true) {
            const originalOnReadyStateChange = super.onreadystatechange;
            super.onreadystatechange = () => {
                if (this.readyState === 4 && this.status === 200) {
                    // 获得返回值
                    const res = super.response;
                    // 你的数据
                    const yourRes = ...;
                    this.response = yourRes;
                }
                originalOnReadyStateChange.call(this);
            };
        }
        return super.open(...params);
    }
}
window.XMLHttpRequest = XMLHttpRequestInter;

Fiddler

方法名 描述 示例
FiddlerObject.alert(ebody) fiddler script alert 方法 :----------------------------------

拦截请求入参

  1. OnBeforeRequest(oSession: Session)

    方法名 描述 示例
    GetRequestBodyAsString 获取字符串形式的请求体 '[{"actionType":"initUser"}]'
    Fiddler.WebFormats.JSON.JsonDecode(GetRequestBodyAsString()) 将获取字符串形式的请求体转化为 JSON [{"actionType":"initUser"}]
function OnBeforeRequest(oSession) {
    const rqbody = oSession.GetRequestBodyAsString();
    if (rqbody.Contains('your string')) {
        // 解析请求体为 JSON 格式
        const rqbodyJSON = Fiddler.WebFormats.JSON.JsonDecode(rqbody);
        // 修改请求体参数
        rqbodyJSON.JSONObject["params"]["loginName"] = "new name";
        // 转换请求体为请求格式
        const rqbodyChanged = Fiddler.WebFormats.JSON.JsonEncode(rqbodyJSON.JSONObject);
        // 修改 oSession 请求体
        oSession.utilSetRequestBody(rqbodyChanged);
    }
}

拦截响应数据

  1. OnBeforeResponse(oSession: Session)

    方法名 描述 示例
    GetResponseBodyAsString 获取字符串形式的响应体 '[{"actionType":"initUser"}]'
    Fiddler.WebFormats.JSON.JsonDecode(GetResponseBodyAsString()) 将获取字符串形式的响应体转化为 JSON [{"actionType":"initUser"}]
function OnBeforeResponse(oSession) {
    const rsbody = oSession.GetResponseBodyAsString();
    if (rsbody.Contains('your string')) {
        // 解析响应数据为 JSON 格式
        const rsbodyJSON = Fiddler.WebFormats.JSON.JsonDecode(rsbody);
        // 修改响应数据
        rsbodyJSON.JSONObject["proName"] = "new name";
        // 转换响应体为标准格式
        const rsbodyChanged = Fiddler.WebFormats.JSON.JsonEncode(rsbodyJSON.JSONObject);
        // 注意:这里应该使用 `oSession.utilSetResponseBody(rsbodyChanged);` 而不是 `rqbodyChanged`
        oSession.utilSetResponseBody(rsbodyChanged);
    }
}

whistle

  1. 查看拦截界面:http://local.whistlejs.com/
  2. 通过配置 host 进行抓包
  3. 请求体只能获取 16k
  4. 参考地址:http://wproxy.org/whistle/
上一篇
下一篇