aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/readrequest_test.go
diff options
context:
space:
mode:
authorAndy Pan <panjf2000@gmail.com>2024-02-04 14:50:42 +0800
committerDamien Neil <dneil@google.com>2024-02-14 22:23:32 +0000
commit48d899dcdbed4534ed942f7ec2917cf86b18af22 (patch)
tree196df55cdf5bb33e1a6ef890f5967beace4ee239 /src/net/http/readrequest_test.go
parentd90a57ffe8ad8f3cb0137822a768ae48cf80a09d (diff)
downloadgo-48d899dcdbed4534ed942f7ec2917cf86b18af22.tar.xz
net/http: reject requests with invalid Content-Length headers
According to RFC 9110 and RFC 9112, invalid "Content-Length" headers might involve request smuggling or response splitting, which could also cause security failures. Currently, `net/http` ignores all "Content-Length" headers when there is a "Transfer-Encoding" header and forward the message anyway while other mainstream HTTP implementations such as Apache Tomcat, Nginx, HAProxy, Node.js, Deno, Tornado, etc. reject invalid Content-Length headers regardless of the presence of a "Transfer-Encoding" header and only forward chunked-encoding messages with either valid "Content-Length" headers or no "Content-Length" headers. Fixes #65505 Change-Id: I73af2ee0785137e56c7546a4cce4a5c5c348dbc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/561075 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Bryan Mills <bcmills@google.com> Reviewed-by: Damien Neil <dneil@google.com>
Diffstat (limited to 'src/net/http/readrequest_test.go')
-rw-r--r--src/net/http/readrequest_test.go16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/net/http/readrequest_test.go b/src/net/http/readrequest_test.go
index 5aaf3b9fe2..2da3122879 100644
--- a/src/net/http/readrequest_test.go
+++ b/src/net/http/readrequest_test.go
@@ -207,6 +207,22 @@ var reqTests = []reqTest{
noError,
},
+ // Tests chunked body and an invalid Content-Length.
+ {
+ "POST / HTTP/1.1\r\n" +
+ "Host: foo.com\r\n" +
+ "Transfer-Encoding: chunked\r\n" +
+ "Content-Length: notdigits\r\n\r\n" + // raise an error
+ "3\r\nfoo\r\n" +
+ "3\r\nbar\r\n" +
+ "0\r\n" +
+ "\r\n",
+ nil,
+ noBodyStr,
+ noTrailer,
+ `bad Content-Length "notdigits"`,
+ },
+
// CONNECT request with domain name:
{
"CONNECT www.google.com:443 HTTP/1.1\r\n\r\n",