mirror of
https://github.com/grafana/grafana.git
synced 2025-09-26 00:43:48 +08:00
Middleware: Add CSP Report Only support (#58074)
* Middleware: Add CSP Report Only support * Update docs/sources/setup-grafana/configure-grafana/_index.md Co-authored-by: Christopher Moyer <35463610+chri2547@users.noreply.github.com> * Update docs/sources/setup-grafana/configure-grafana/_index.md Co-authored-by: Christopher Moyer <35463610+chri2547@users.noreply.github.com> * Update csp documentation wording * Update conf/sample.ini Co-authored-by: Dave Henderson <dave.henderson@grafana.com> * Update docs/sources/setup-grafana/configure-grafana/_index.md Co-authored-by: Dave Henderson <dave.henderson@grafana.com> * Update docs/sources/setup-grafana/configure-grafana/_index.md Co-authored-by: Dave Henderson <dave.henderson@grafana.com> * Update docs/sources/setup-grafana/configure-grafana/_index.md Co-authored-by: Dave Henderson <dave.henderson@grafana.com> * Update pkg/middleware/csp.go Co-authored-by: Dave Henderson <dave.henderson@grafana.com> Co-authored-by: Christopher Moyer <35463610+chri2547@users.noreply.github.com> Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
This commit is contained in:
@ -83,6 +83,47 @@ func TestMiddleWareSecurityHeaders(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestMiddleWareContentSecurityPolicyHeaders(t *testing.T) {
|
||||
policy := `script-src 'self' 'strict-dynamic' 'nonce-[^']+';connect-src 'self' ws://localhost:3000/ wss://localhost:3000/;`
|
||||
|
||||
middlewareScenario(t, "middleware should add Content-Security-Policy", func(t *testing.T, sc *scenarioContext) {
|
||||
sc.fakeReq("GET", "/api/").exec()
|
||||
assert.Regexp(t, policy, sc.resp.Header().Get("Content-Security-Policy"))
|
||||
}, func(cfg *setting.Cfg) {
|
||||
cfg.CSPEnabled = true
|
||||
cfg.CSPTemplate = "script-src 'self' 'strict-dynamic' $NONCE;connect-src 'self' ws://$ROOT_PATH wss://$ROOT_PATH;"
|
||||
cfg.AppURL = "http://localhost:3000/"
|
||||
})
|
||||
|
||||
middlewareScenario(t, "middleware should add Content-Security-Policy-Report-Only", func(t *testing.T, sc *scenarioContext) {
|
||||
sc.fakeReq("GET", "/api/").exec()
|
||||
assert.Regexp(t, policy, sc.resp.Header().Get("Content-Security-Policy-Report-Only"))
|
||||
}, func(cfg *setting.Cfg) {
|
||||
cfg.CSPReportOnlyEnabled = true
|
||||
cfg.CSPReportOnlyTemplate = "script-src 'self' 'strict-dynamic' $NONCE;connect-src 'self' ws://$ROOT_PATH wss://$ROOT_PATH;"
|
||||
cfg.AppURL = "http://localhost:3000/"
|
||||
})
|
||||
|
||||
middlewareScenario(t, "middleware can add both CSP and CSP-Report-Only", func(t *testing.T, sc *scenarioContext) {
|
||||
sc.fakeReq("GET", "/api/").exec()
|
||||
|
||||
cspHeader := sc.resp.Header().Get("Content-Security-Policy")
|
||||
cspReportOnlyHeader := sc.resp.Header().Get("Content-Security-Policy-Report-Only")
|
||||
|
||||
assert.Regexp(t, policy, cspHeader)
|
||||
assert.Regexp(t, policy, cspReportOnlyHeader)
|
||||
|
||||
// assert CSP-Report-Only reuses the same nonce as CSP
|
||||
assert.Equal(t, cspHeader, cspReportOnlyHeader)
|
||||
}, func(cfg *setting.Cfg) {
|
||||
cfg.CSPEnabled = true
|
||||
cfg.CSPTemplate = "script-src 'self' 'strict-dynamic' $NONCE;connect-src 'self' ws://$ROOT_PATH wss://$ROOT_PATH;"
|
||||
cfg.CSPReportOnlyEnabled = true
|
||||
cfg.CSPReportOnlyTemplate = "script-src 'self' 'strict-dynamic' $NONCE;connect-src 'self' ws://$ROOT_PATH wss://$ROOT_PATH;"
|
||||
cfg.AppURL = "http://localhost:3000/"
|
||||
})
|
||||
}
|
||||
|
||||
func TestMiddlewareContext(t *testing.T) {
|
||||
const noCache = "no-cache"
|
||||
|
||||
@ -770,7 +811,7 @@ func middlewareScenario(t *testing.T, desc string, fn scenarioFunc, cbs ...func(
|
||||
|
||||
sc.m = web.New()
|
||||
sc.m.Use(AddDefaultResponseHeaders(cfg))
|
||||
sc.m.UseMiddleware(AddCSPHeader(cfg, logger))
|
||||
sc.m.UseMiddleware(ContentSecurityPolicy(cfg, logger))
|
||||
sc.m.UseMiddleware(web.Renderer(viewsPath, "[[", "]]"))
|
||||
|
||||
sc.mockSQLStore = dbtest.NewFakeDB()
|
||||
|
Reference in New Issue
Block a user