mirror of https://github.com/golang/go.git
The HTML specification has incredibly complex rules for how to handle "<!--", "<script", and "</script" when they appear within literals in the script context. Rather than attempting to apply these restrictions (which require a significantly more complex state machine) we apply the workaround suggested in section 4.12.1.3 of the HTML specification [1]. More precisely, when "<!--", "<script", and "</script" appear within literals (strings and regular expressions, ignoring comments since we already elide their content) we replace the "<" with "\x3C". This avoids the unintuitive behavior that using these tags within literals can cause, by simply preventing the rendered content from triggering it. This may break some correct usages of these tags, but on balance is more likely to prevent XSS attacks where users are unknowingly either closing or not closing the script blocks where they think they are. Thanks to Takeshi Kaneko (GMO Cybersecurity by Ierae, Inc.) for reporting this issue. Fixes #62197 Fixes CVE-2023-39319 [1] https://html.spec.whatwg.org/#restrictions-for-contents-of-script-elements Change-Id: Iab57b0532694827e3eddf57a7497ba1fab1746dc Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1976594 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Tatiana Bradley <tatianabradley@google.com> Reviewed-by: Damien Neil <dneil@google.com> Run-TryBot: Roland Shoemaker <bracewell@google.com> Reviewed-on: https://go-review.googlesource.com/c/go/+/526157 Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Roland Shoemaker <roland@golang.org> |
||
|---|---|---|
| .. | ||
| testdata | ||
| attr.go | ||
| attr_string.go | ||
| clone_test.go | ||
| content.go | ||
| content_test.go | ||
| context.go | ||
| css.go | ||
| css_test.go | ||
| delim_string.go | ||
| doc.go | ||
| element_string.go | ||
| error.go | ||
| escape.go | ||
| escape_test.go | ||
| example_test.go | ||
| examplefiles_test.go | ||
| exec_test.go | ||
| html.go | ||
| html_test.go | ||
| js.go | ||
| js_test.go | ||
| jsctx_string.go | ||
| multi_test.go | ||
| state_string.go | ||
| template.go | ||
| template_test.go | ||
| transition.go | ||
| transition_test.go | ||
| url.go | ||
| url_test.go | ||
| urlpart_string.go | ||