你正在使用哪个版本的Go( go version
)?
$ go version
go version go1.15.6 darwin/amd64
这个问题在最新版本中是否会重现?
是的
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/elibishop/Library/Caches/go-build"
GOENV="/Users/elibishop/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/elibishop/.gvm/pkgsets/go1.15.6/global/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/elibishop/.gvm/pkgsets/go1.15.6/global"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/elibishop/.gvm/gos/go1.15.6"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/elibishop/.gvm/gos/go1.15.6/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/elibishop/work/test/goheaderbug/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/c8/g71crjpd18nc6jkdykcvp_ww0000gn/T/go-build182950335=/tmp/go-build -gno-record-gcc-switches -fno-common"
你做了什么?
package main
import (
"fmt"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "http://worldtimeapi.org/api/timezone", nil)
req.Header.Add("Authorization", "my-secret-key\n")
_, err := http.DefaultClient.Do(req)
fmt.Println(err)
}
你期望看到什么?
由于换行符在HTTP头值中不是有效的字符,我希望Go的HTTP客户端返回一个错误,抱怨错误的头。它确实如此,但是...
你看到了什么?
Get "http://worldtimeapi.org/api/timezone": net/http: invalid header field value "my-secret-key\n" for key Authorization
我认为将完整的实际头值包含在这样的错误消息中是非常不理想的,因为将任何I/O错误的消息写入应用程序日志是很常见的。在这个特定的例子中尤其不合适,因为这是特定的 Authorization
头,其值几乎可以保证是敏感信息,但实际上任何头值都可能是敏感的。
这不是一个刻意制造的例子 - 我们的一位客户不小心在他们提供给我们的库的API密钥中包含了换行符后缀,他们非常不满意地看到密钥出现在他们的日志中,因为我们的代码记录了I/O错误。
3条答案
按热度按时间9rnv2umw1#
CC @neild@bradfitz
sd2nnvve2#
https://golang.org/cl/355929提到了这个问题:
net/http: omit invalid header value from error message
wmvff8tz3#
https://golang.org/cl/355930提到了这个问题:
net/http2: omit invalid header value from error message