概览严格的 CSP 可有效阻断非受信脚本,Trusted Types 能限制危险的字符串到脚本/HTML 的赋值路径。在 Next.js 15 App Router 下,结合 nonce 与策略可实现细粒度的前端脚本治理。设置安全头next.config.tsconst securityHeaders = [ { key: 'Content-Security-Policy', value: [ "default-src 'self'", "script-src 'self' 'nonce-__nonce__'", "style-src 'self' 'unsafe-inline'", "img-src 'self' data:", "connect-src 'self'", "require-trusted-types-for 'script'", "trusted-types app default" ].join('; '), }, { key: 'X-Content-Type-Options', value: 'nosniff' }, { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' }, { key: 'Permissions-Policy', value: 'geolocation=(), microphone=()' }, ] export default { async headers() { return [ { source: '/(.*)', headers: securityHeaders, }, ] }, } 注入 nonce 与策略app/layout.tsxexport default function RootLayout({ children }: { children: React.ReactNode }) { const nonce = crypto.randomUUID() return ( <html> <head> <meta httpEquiv="Content-Security-Policy" content={`script-src 'self' 'nonce-${nonce}'; require-trusted-types-for 'script'; trusted-types app default`} /> <script nonce={nonce} dangerouslySetInnerHTML={{ __html: ` (function(){ if (window.trustedTypes && !trustedTypes.getPolicy('app')) { trustedTypes.createPolicy('app', { createScriptURL: (s) => s, createHTML: (s) => s }); } })(); ` }} /> </head> <body>{children}</body> </html> ) } 客户端加载治理'use client' // 仅通过受信策略生成 URL/HTML const policy = (window as any).trustedTypes?.getPolicy('app') const url = policy?.createScriptURL('/trusted.js') ?? '/trusted.js' const s = document.createElement('script') ;(s as any).src = url document.head.appendChild(s) 验证与指标浏览器:Chrome 120+(Trusted Types)、现代浏览器均支持 CSP;Safari/Firefox 对 Trusted Types 支持有限时仅启用 CSPNext.js:15.0+;Node.js:20.x安全:阻断内联脚本与不受信的注入路径;通过受信策略白名单加载脚本

发表评论 取消回复