Merge SEC-10: add Permissions-Policy header

This commit is contained in:
2026-03-13 00:49:34 -07:00
2 changed files with 5 additions and 0 deletions

View File

@@ -564,6 +564,9 @@ func noDirListing(next http.Handler) http.Handler {
// requests to this origin for two years, preventing TLS-strip on revisit. // requests to this origin for two years, preventing TLS-strip on revisit.
// - Referrer-Policy: suppresses the Referer header on outbound navigations so // - Referrer-Policy: suppresses the Referer header on outbound navigations so
// JWTs or session identifiers embedded in URLs are not leaked to third parties. // JWTs or session identifiers embedded in URLs are not leaked to third parties.
// - Permissions-Policy: disables browser features (camera, microphone,
// geolocation, payment) that this application does not use, reducing the
// attack surface if a content-injection vulnerability is exploited.
func securityHeaders(next http.Handler) http.Handler { func securityHeaders(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
h := w.Header() h := w.Header()
@@ -573,6 +576,7 @@ func securityHeaders(next http.Handler) http.Handler {
h.Set("X-Frame-Options", "DENY") h.Set("X-Frame-Options", "DENY")
h.Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains") h.Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains")
h.Set("Referrer-Policy", "no-referrer") h.Set("Referrer-Policy", "no-referrer")
h.Set("Permissions-Policy", "camera=(), microphone=(), geolocation=(), payment=()")
next.ServeHTTP(w, r) next.ServeHTTP(w, r)
}) })
} }

View File

@@ -79,6 +79,7 @@ func assertSecurityHeaders(t *testing.T, h http.Header, label string) {
{"X-Frame-Options", "DENY"}, {"X-Frame-Options", "DENY"},
{"Strict-Transport-Security", "max-age="}, {"Strict-Transport-Security", "max-age="},
{"Referrer-Policy", "no-referrer"}, {"Referrer-Policy", "no-referrer"},
{"Permissions-Policy", "camera=()"},
} }
for _, c := range checks { for _, c := range checks {
val := h.Get(c.header) val := h.Get(c.header)