前端安全不再是「可選的附加項」,而是應用架構的核心部分。2026 年的 Web 安全環境更加複雜,CSP v3 和 SRI 提供了標準化的防護機制。
Content Security Policy 基礎
CSP 通過 HTTP 頭或 meta 標籤控制資源加載:
html
<!-- HTTP 頭 -->
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123'
<!-- meta 標籤 -->
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'nonce-abc123'">
CSP v3 新特性
html
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-abc123' 'strict-dynamic';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
upgrade-insecure-requests;
關鍵改進:
strict-dynamic:信任已有腳本加載的新腳本frame-ancestors:替代X-Frame-Optionsbase-uri:防止<base>標籤劫持form-action:限制表單提交目標
Nonce 生成與使用
typescript
// 服務端生成 nonce
function generateNonce(): string {
return crypto.randomBytes(16).toString('base64');
}
// 中間件添加 CSP 頭
app.use((req, res, next) => {
const nonce = generateNonce();
res.locals.cspNonce = nonce;
res.setHeader('Content-Security-Policy', `
default-src 'self';
script-src 'self' 'nonce-${nonce}' 'strict-dynamic';
style-src 'self' 'nonce-${nonce}';
`);
next();
});
Subresource Integrity
SRI 確保外部資源不被篡改:
html
<script src="https://cdn.example.com/lib.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>
漸進式部署
html
<!-- 階段 1:僅報告 -->
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
<!-- 階段 2:寬鬆策略 -->
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval'
<!-- 階段 3:嚴格策略 -->
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-xxx'
總結
CSP v3 和 SRI 是 2026 年前端安全的基礎。CSP 控制資源加載來源,SRI 確保資源完整性。部署時應該漸進式啟用,先用 Report-Only 收集數據,再逐步收緊策略。
