我一直在研究一个 golang 脚本,它使用chrome devtools 协议来:
1)拦截一个请求
2)抓取拦截请求的响应体
3)对html
文档进行一些修改
4)继续拦截的请求
该脚本适用于 HTML 文档,除非Content-Encoding
设置为gzip
. 分步过程如下所示”
1)拦截请求
s.Debugger.CallbackEvent("Network.requestIntercepted", func(params godet.Params) {
iid := params.String("interceptionId")
rtype := params.String("resourceType")
reason := responses[rtype]
headers := getHeadersString(params["responseHeaders"])
log.Println("[+] Request intercepted for", iid, rtype, params.Map("request")["url"])
if reason != "" {
log.Println(" abort with reason", reason)
}
// Alter HTML in request response
if s.Options.AlterDocument && rtype == "Document" && iid != "" {
res, err := s.Debugger.GetResponseBodyForInterception(iid)
if err != nil {
log.Println("[-] Unable to get intercepted response body!")
}
rawAlteredResponse, err := AlterDocument(res, headers)
if err != nil{
log.Println("[-] Unable to alter HTML")
}
if rawAlteredResponse != "" {
log.Println("[+] Sending modified body")
err := s.Debugger.ContinueInterceptedRequest(iid, godet.ErrorReason(reason), rawAlteredResponse, "", "", "", nil)
if err != nil {
fmt.Println("OH NOES AN ERROR!")
log.Println(err)
}
}
} else {
s.Debugger.ContinueInterceptedRequest(iid, godet.ErrorReason(reason), "", "", "", "", nil)
}
})
2)改变响应体
在这里,我对 HTML 标记做了一些小改动procesHtml()(但该功能的代码与此问题无关,因此不会在此处发布)。我还从请求中获取标头,并在必要时更新content-length和date继续响应。然后,我在调用时对主体进行 gzip 压缩r := gZipCompress([]byte(alteredBody),它返回一个字符串。然后将该字符串连接到标头,这样我就可以制作rawResponse.
func AlterDocument(debuggerResponse []byte, headers map[string]string) (string, error) {
alteredBody, err := processHtml(debuggerResponse)
if err != nil {
return "", err
}
Helenr
相关分类