Security Headers
Add comprehensive security headers to protect your application.
Basic Usage
go
import "github.com/ginjigo/ginji/middleware"
app.Use(middleware.Secure())Strict Mode
Maximum security for production:
go
app.Use(middleware.SecureStrict())Custom Configuration
go
config := middleware.SecureConfig{
XSSProtection: "1; mode=block",
ContentTypeNosniff: "nosniff",
XFrameOptions: "DENY",
HSTSMaxAge: 31536000, // 1 year
HSTSIncludeSubdomains: true,
HSTSPreload: true,
ContentSecurityPolicy: "default-src 'self'",
ReferrerPolicy: "strict-origin-when-cross-origin",
}
app.Use(middleware.SecureWithConfig(config))CSP Builder
Build Content Security Policy easily:
go
csp := middleware.NewCSP().
DefaultSrc("'self'").
ScriptSrc("'self'", "'unsafe-inline'", "https://cdn.example.com").
StyleSrc("'self'", "https://fonts.googleapis.com").
ImgSrc("'self'", "data:", "https:").
FontSrc("'self'", "https://fonts.gstatic.com").
ConnectSrc("'self'").
FrameSrc("'none'").
ObjectSrc("'none'").
UpgradeInsecureRequests().
Build()
config := middleware.SecureConfig{
ContentSecurityPolicy: csp,
}
app.Use(middleware.SecureWithConfig(config))Headers Set
XSS Protection
X-XSS-Protection: 1; mode=blockContent Type Nosniff
X-Content-Type-Options: nosniffFrame Options
X-Frame-Options: DENYHSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadCSP
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'Referrer Policy
Referrer-Policy: strict-origin-when-cross-originPermissions Policy
Permissions-Policy: geolocation=(), microphone=(), camera=()Cross-Origin Policies
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-originComplete Example
go
package main
import (
"github.com/ginjigo/ginji"
"github.com/ginjigo/ginji/middleware"
)
func main() {
app := ginji.New()
// Build CSP
csp := middleware.NewCSP().
DefaultSrc("'self'").
ScriptSrc("'self'", "https://cdn.jsdelivr.net").
StyleSrc("'self'", "'unsafe-inline'").
ImgSrc("'self'", "data:", "https:").
FontSrc("'self'", "https://fonts.gstatic.com").
Build()
// Configure security headers
app.Use(middleware.SecureWithConfig(middleware.SecureConfig{
XFrameOptions: "SAMEORIGIN",
HSTSMaxAge: 31536000,
HSTSIncludeSubdomains: true,
ContentSecurityPolicy: csp,
ReferrerPolicy: "no-referrer-when-downgrade",
}))
app.Get("/", func(c *ginji.Context) {
c.HTML(ginji.StatusOK, "<h1>Secure App</h1>")
})
app.Listen(":443") // Use HTTPS in production
}Best Practices
- Use HTTPS - Security headers work best with HTTPS
- Start strict - Use
SecureStrict()and relax as needed - Test CSP - Use report-only mode first
- Enable HSTS - Force HTTPS for all requests
- Regular updates - Keep security policies current
Security Checklist
- ✅ XSS Protection enabled
- ✅ Content Type nosniffing
- ✅ Clickjacking protection (X-Frame-Options)
- ✅ HSTS with preload
- ✅ Content Security Policy
- ✅ Referrer Policy set
- ✅ Cross-Origin policies configured