diff --git a/internal/server/routes.go b/internal/server/routes.go index 9cc0103..a35cd67 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -16,6 +16,11 @@ import ( const routeTimeout = 60 * time.Second +// cspHeader is the Content-Security-Policy applied to the embedded web SPA. +// The SPA loads external scripts and stylesheets from the same origin only; +// all API communication uses same-origin fetch (no WebSockets). +const cspHeader = "default-src 'self'; script-src 'self'; style-src 'self'" + // SetupRoutes configures the HTTP routes and middleware. func (srv *Server) SetupRoutes() { srv.router = chi.NewRouter() @@ -133,6 +138,11 @@ func (srv *Server) setupSPA() { writer http.ResponseWriter, request *http.Request, ) { + writer.Header().Set( + "Content-Security-Policy", + cspHeader, + ) + readFS, ok := distFS.(fs.ReadFileFS) if !ok { fileServer.ServeHTTP(writer, request)