有这样一个处理程序,据我了解,该漏洞的实现是由于在检查错误之前响应正文已关闭。但我真的不明白为什么这应该起作用,因为无论是否在检查之后,主体仍然是关闭的。
func HandleRequest(client http.Client, request *http.Request)
(*http.Response, error) {
response, err := client.Do(request)
defer response.Body.Close()
if err != nil {
return nil, err
}
}
我知道完全没有线路defer response.Body.Close()肯定会导致问题,但我不知道如何测试上述漏洞
defer response.Body.Close()意味着response.Body.Close()应该在函数的退出点执行什么。没有谈到在检查错误之前关闭主体。这里的问题是不同的 - 如果发生错误,响应可能为零,并且
if err != nil {... return ...}在这种情况下在分支中执行延迟指令将因访问空指针而导致恐慌。示例: https: //go.dev/play/p/vEiUFPgLYxf