前面兩天聊了 bcrypt 和 JWT,今天來講講另一個很重要但常被忽略的東西 - Helmet。這個套件可以幫你的 Express 應用程式防止一些常見的網頁攻擊。
Helmet 是一個非常實用的 Node.js 安全中間件,它幫你設定各種 HTTP 安全標頭(Security Headers),讓你的 Express.js 應用程式更加安全。
在現代網路環境中,網站面臨各種安全威脅:
Helmet 透過設定適當的 HTTP 標頭來防範這些攻擊。
// 在 package.json 中已安裝
"helmet": "^7.1.0"
// 在 app.ts 中引入
import helmet from 'helmet';
// 在 app.ts 第 73 行
app.use(helmet());
當你使用 helmet()
時,它會自動設定以下安全標頭:
Content-Security-Policy: default-src 'self'
防止 XSS 攻擊,限制資源載入來源。
X-Frame-Options: SAMEORIGIN
防止點擊劫持攻擊,限制頁面是否可以被嵌入到 iframe 中。
X-Content-Type-Options: nosniff
防止 MIME 類型嗅探攻擊,確保瀏覽器按照正確的內容類型處理檔案。
Referrer-Policy: no-referrer
控制瀏覽器在導航時發送的 referrer 資訊。
X-DNS-Prefetch-Control: off
控制瀏覽器的 DNS 預取功能。
Helmet 還支援許多進階選項:
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
scriptSrc: ["'self'"],
imgSrc: ["'self'", "data:", "https:"],
},
},
}));
app.use(helmet({
hsts: {
maxAge: 31536000,
includeSubDomains: true,
preload: true
}
}));
app.use(helmet.hidePoweredBy());
app.use(helmet.xssFilter());
讓我們看看 Helmet 在實際請求中的效果:
HTTP/1.1 200 OK
Content-Type: application/json
X-Powered-By: Express
HTTP/1.1 200 OK
Content-Type: application/json
Content-Security-Policy: default-src 'self'
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer
X-DNS-Prefetch-Control: off
// 開發環境可能需要更寬鬆的 CSP
if (process.env.NODE_ENV === 'development') {
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'unsafe-inline'", "'unsafe-eval'"], // 開發時允許
},
},
}));
} else {
app.use(helmet()); // 生產環境使用嚴格設定
}
在我們的專案中,Helmet 與 CORS 配合使用:
// 先設定安全標頭
app.use(helmet());
// 再設定 CORS
app.use(cors(corsOptions));
可以使用以下工具測試你的安全標頭: