aboutsummaryrefslogtreecommitdiff
path: root/src/html/template/context.go
diff options
context:
space:
mode:
authorRoland Shoemaker <bracewell@google.com>2026-01-09 11:12:01 -0800
committerCherry Mui <cherryyz@google.com>2026-03-05 17:05:07 -0800
commitfb16297ae571a232e46a67e6e40027f1f82ef6ec (patch)
treeb7e6af55fa6024240fa080981913cb47834e560e /src/html/template/context.go
parent36d8b15842748194c4a2ce7e9cf46c65a958283c (diff)
downloadgo-fb16297ae571a232e46a67e6e40027f1f82ef6ec.tar.xz
html/template: properly escape URLs in meta content attributes
The meta tag can include a content attribute that contains URLs, which we currently don't escape if they are inserted via a template action. This can plausibly lead to XSS vulnerabilities if untrusted data is inserted there, the http-equiv attribute is set to "refresh", and the content attribute contains an action like `url={{.}}`. Track whether we are inside of a meta element, if we are inside of a content attribute, _and_ if the content attribute contains "url=". If all of those are true, then we will apply the same URL escaping that we use elsewhere. Also add a new GODEBUG, htmlmetacontenturlescape, to allow disabling this escaping for cases where this behavior is considered safe. The behavior can be disabled by setting htmlmetacontenturlescape=0. Fixes CVE-2026-27142 Fixes #77954 Change-Id: I9bbca263be9894688e6ef1e9a8f8d2f4304f5873 Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/3360 Reviewed-by: Neal Patel <nealpatel@google.com> Reviewed-by: Nicholas Husin <husin@google.com> Reviewed-on: https://go-review.googlesource.com/c/go/+/752181 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/html/template/context.go')
-rw-r--r--src/html/template/context.go8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/html/template/context.go b/src/html/template/context.go
index b78f0f7325..8b3af2feab 100644
--- a/src/html/template/context.go
+++ b/src/html/template/context.go
@@ -156,6 +156,10 @@ const (
// stateError is an infectious error state outside any valid
// HTML/CSS/JS construct.
stateError
+ // stateMetaContent occurs inside a HTML meta element content attribute.
+ stateMetaContent
+ // stateMetaContentURL occurs inside a "url=" tag in a HTML meta element content attribute.
+ stateMetaContentURL
// stateDead marks unreachable code after a {{break}} or {{continue}}.
stateDead
)
@@ -267,6 +271,8 @@ const (
elementTextarea
// elementTitle corresponds to the RCDATA <title> element.
elementTitle
+ // elementMeta corresponds to the HTML <meta> element.
+ elementMeta
)
//go:generate stringer -type attr
@@ -288,4 +294,6 @@ const (
attrURL
// attrSrcset corresponds to a srcset attribute.
attrSrcset
+ // attrMetaContent corresponds to the content attribute in meta HTML element.
+ attrMetaContent
)