fix: POC 扫描遇到非 HTTP 服务时不再输出错误日志

扫描非 HTTP 端口时 Go net/http 返回 malformed HTTP status code 等
transport 级错误,属于正常现象,不应作为 error 输出。
在 executeRule 和 clustersend 两个调用点统一过滤 transport 错误,
返回 false, nil 表示"目标不可达 = 无漏洞"。
This commit is contained in:
ZacharyZcR
2026-06-27 15:36:42 +08:00
parent 34638954b8
commit ed2f947722
+25
View File
@@ -2,9 +2,11 @@ package lib
import ( import (
"crypto/md5" //nolint:gosec // G501: MD5用于POC规则去重,非加密用途 "crypto/md5" //nolint:gosec // G501: MD5用于POC规则去重,非加密用途
"errors"
"fmt" "fmt"
"io" "io"
"math/rand" //nolint:gosec // G404: math/rand用于生成测试数据,非加密用途 "math/rand" //nolint:gosec // G404: math/rand用于生成测试数据,非加密用途
"net"
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
@@ -236,6 +238,9 @@ func executeRules(oReq *http.Request, p *Poc, variableMap map[string]interface{}
resp, err := DoRequest(newRequest, rule.FollowRedirects, session) resp, err := DoRequest(newRequest, rule.FollowRedirects, session)
newRequest = nil newRequest = nil
if err != nil { if err != nil {
if isTransportError(err) {
return false, nil
}
return false, err return false, err
} }
@@ -793,6 +798,9 @@ func clustersend(oReq *http.Request, variableMap map[string]interface{}, req *Re
// 发送请求 // 发送请求
resp, err := DoRequest(newRequest, rule.FollowRedirects, session) resp, err := DoRequest(newRequest, rule.FollowRedirects, session)
if err != nil { if err != nil {
if isTransportError(err) {
return false, nil
}
return false, fmt.Errorf("%s: %w", i18n.GetText("webscan_request_send_error"), err) return false, fmt.Errorf("%s: %w", i18n.GetText("webscan_request_send_error"), err)
} }
@@ -936,3 +944,20 @@ func GetHeader(header map[string]string) string {
builder.WriteString("\r\n") builder.WriteString("\r\n")
return builder.String() return builder.String()
} }
func isTransportError(err error) bool {
if err == nil {
return false
}
var netErr *net.OpError
if errors.As(err, &netErr) {
return true
}
s := err.Error()
return strings.Contains(s, "malformed HTTP") ||
strings.Contains(s, "transport connection broken") ||
strings.Contains(s, "connection reset") ||
strings.Contains(s, "connection refused") ||
strings.Contains(s, "i/o timeout") ||
strings.Contains(s, "EOF")
}