mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
net/http: fix authentication info leakage in Referer header (potential security risk)
http.Client calls URL.String() to fill in the Referer header, which may contain authentication info. This patch removes authentication info from the Referer header without introducing any API changes. A new test for net/http is also provided. This is the polished version of Alberto García Hierro's https://golang.org/cl/9766046/ It should handle https Referer right. Fixes #8417 LGTM=bradfitz R=golang-codereviews, gobot, bradfitz, mikioh.mikioh CC=golang-codereviews https://golang.org/cl/151430043
This commit is contained in:
parent
6e8f7b4f3e
commit
f739b77508
3 changed files with 68 additions and 2 deletions
|
|
@ -1036,3 +1036,40 @@ func TestClientTrailers(t *testing.T) {
|
|||
t.Errorf("Response trailers = %#v; want %#v", res.Trailer, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestReferer(t *testing.T) {
|
||||
tests := []struct {
|
||||
lastReq, newReq string // from -> to URLs
|
||||
want string
|
||||
}{
|
||||
// don't send user:
|
||||
{"http://gopher@test.com", "http://link.com", "http://test.com"},
|
||||
{"https://gopher@test.com", "https://link.com", "https://test.com"},
|
||||
|
||||
// don't send a user and password:
|
||||
{"http://gopher:go@test.com", "http://link.com", "http://test.com"},
|
||||
{"https://gopher:go@test.com", "https://link.com", "https://test.com"},
|
||||
|
||||
// nothing to do:
|
||||
{"http://test.com", "http://link.com", "http://test.com"},
|
||||
{"https://test.com", "https://link.com", "https://test.com"},
|
||||
|
||||
// https to http doesn't send a referer:
|
||||
{"https://test.com", "http://link.com", ""},
|
||||
{"https://gopher:go@test.com", "http://link.com", ""},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
l, err := url.Parse(tt.lastReq)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
n, err := url.Parse(tt.newReq)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
r := ExportRefererForURL(l, n)
|
||||
if r != tt.want {
|
||||
t.Errorf("refererForURL(%q, %q) = %q; want %q", tt.lastReq, tt.newReq, r, tt.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue