【译】Fiddler 之修改请求或响应

2,032 阅读3分钟

原文:docs.telerik.com/fiddler/kno…


在 Fiddler 的 onBeforeRequest 或 onBeforeResponse 函数中使用 FiddlerScript 编写规则可以自定义修改 web 请求或响应。使用哪个函数更合适取决于你在编码中需要使用的对象:OnBeforeRequest 会在每个请求前被调用,OnBeforeResponse 会在每个响应前被调用。注意:

  • 没办法在 OnBeforeRequest 内使用 response 类对象,因为它们还没被创建。
  • 可以在 OnBeforeResponse 内使用 request 类对象;然而,所有对它们的修改对 server 来说都是不可见的,因为在这之前 server 已经收到了请求。

添加请求头:

oSession.oRequest["NewHeaderName"] = "New header value";

删除响应头:

oSession.oResponse.headers.Remove("Set-Cookie");

改变一个页面请求到同一服务器的另外一个页面:

if (oSession.PathAndQuery=="/version1.css") {
  oSession.PathAndQuery="/version2.css";
}

将一个服务器的所有请求指向到另一服务器的相同端口:

if (oSession.HostnameIs("www.bayden.com")) {
  oSession.hostname="test.bayden.com";
}

将一个服务器的所有请求指向到两一个服务器的不同端口:

if (oSession.host=="www.bayden.com:8080") {
  oSession.host="test.bayden.com:9090";
}

将一个服务器的所有请求指向到另一个服务器,包括 HTTPS tunnels:

// 重定向浏览,包括 HTTPS tunnels
if (oSession.HTTPMethodIs("CONNECT") && (oSession.PathAndQuery == "www.example.com:443")) { 
  oSession.PathAndQuery = "beta.example.com:443"; 
}

if (oSession.HostnameIs("www.example.com")) oSession.hostname = "beta.example.com";

模仿 Windows 的 HOSTS 文件,修改一个 Hostname 的指向到其它 IP 地址。(无需更改 Host 请求头实现修改访问目标):

// 所有 subdomain.example.com 的请求将会定向到开发服务器 128.123.133.123
if (oSession.HostnameIs("subdomain.example.com")){
  oSession.bypassGateway = true;                   // 阻止此请求通过上游代理
  oSession["x-overrideHost"] = "128.123.133.123";  // 目标服务器的 DNS 名称或者 IP 地址
}

修改一个页面的请求指向到另一个页面,甚至指向到另一个服务器上的页面。(通过修改 Host 请求头实现):

if (oSession.url=="www.example.com/live.js") {
  oSession.url = "dev.example.com/workinprogress.js";
}

阻止上传 HTTP Cookies:

oSession.oRequest.headers.Remove("Cookie");

解压并拆包一个 HTTP 响应,按需更新响应头:

// 为了更方便的修改响应数据,取消响应的压缩或打包
oSession.utilDecodeResponse();

搜索并替换 HTML:

if (oSession.HostnameIs("www.bayden.com") && oSession.oResponse.headers.ExistsAndContains("Content-Type","text/html")){
  oSession.utilDecodeResponse();
  oSession.utilReplaceInResponse('<b>','<u>');
}

忽略大小写搜索响应中的 HTML:

if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "text/html") && oSession.utilFindInResponse("searchfor", false)>-1){
  oSession["ui-color"] = "red";
}

删除所有 DIV 标签(包括标签内的内容):

// 如果响应头 content-type 为 HTML,删除所有 DIV 标签
if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")){
  // 取消压缩和打包
  oSession.utilDecodeResponse();
  var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);

  // 替换所有 DIV 标签为空字符串
  var oRegEx = /<div[^>]*>(.*?)<\/div>/gi;
  oBody = oBody.replace(oRegEx, "");

  // 设置响应体内容为去掉 DIV 后的内容
  oSession.utilSetResponseBody(oBody); 
}

将你的浏览器伪装成 Google 爬虫:

oSession.oRequest["User-Agent"]="Googlebot/2.X (+http://www.googlebot.com/bot.html)";

请求获得希伯来语(犹太人民族的语言以色列国通用语言)的内容:

oSession.oRequest["Accept-Language"]="he";

阻止 .CSS 请求:

if (oSession.uriContains(".css")){
  oSession["ui-color"]="orange"; 
  oSession["ui-bold"]="true";
  oSession.oRequest.FailSession(404, "Blocked", "Fiddler blocked CSS file");
}

伪造一个 HTTP Basic 验证(需要用户输入密码后才能显示内容):

if ((oSession.HostnameIs("www.example.com")) && 
    !oSession.oRequest.headers.Exists("Authorization")) 
  {
    // 为了阻止 IE 出现 “友好的错误信息” 而隐藏掉我们的错误信息,需要使响应体的长度大于 512 字符。
    var oBody = "<html><body>[Fiddler] Authentication Required.<BR>".PadRight(512, ' ') + "</body></html>";
    oSession.utilSetResponseBody(oBody); 
    // 构建响应头
    oSession.oResponse.headers.HTTPResponseCode = 401;
    oSession.oResponse.headers.HTTPResponseStatus = "401 Auth Required";
    oSession.oResponse["WWW-Authenticate"] = "Basic realm=\"Fiddler (just hit Ok)\"";
    oResponse.headers.Add("Content-Type", "text/html");
  }

修改一个请求的响应为从本地 \Captures\Responses 文件夹加载的文件(可以用于 OnBeforeRequest 或 OnBeforeResponse 函数中):

if (oSession.PathAndQuery=="/version1.css") {
  oSession["x-replywithfile"] ="version2.css";
}


第一次翻译,有错望指出。