DDevArchive
Đăng nhập

CORS, Helmet & Security headers: bảo vệ API khỏi tấn công phổ biến

API của bạn đang mở toang: ai cũng gọi được từ bất kỳ domain nào, không có header bảo vệ. CORS kiểm soát ai được gọi API, Helmet thêm các header chống XSS, clickjacking và sniffing. Đây là "khoá cửa" cơ bản cho mọi ứng dụng web.

CORS: ai được gọi API của bạn?

CORS (Cross-Origin Resource Sharing) là cơ chế trình duyệt kiểm soát: “frontend ở domain A có được gọi API ở domain B không?”. Mặc định: KHÔNG. Bạn phải cấu hình server cho phép.

// File: cors.js
import cors from 'cors'

// ❌ SAI: cho phép tất cả — chỉ dùng khi dev
app.use(cors()) // origin: '*'

// ✅ ĐÚNG: chỉ cho phép domain frontend của bạn
app.use(cors({
  origin: ['https://myapp.com', 'http://localhost:3000'],
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  credentials: true, // cho phép gửi cookie
}))

Helmet: thêm security headers tự động

Helmet là middleware Express thêm hàng loạt HTTP header bảo mật. Một dòng app.use(helmet()) bảo vệ chống nhiều loại tấn công phổ biến.

HeaderChống gìHelmet tự thêm?
X-Content-Type-OptionsSniffing: trình duyệt tự đoán MIME type sai
X-Frame-OptionsClickjacking: nhúng trang bạn vào iframe
Strict-Transport-SecurityÉp dùng HTTPS
Content-Security-PolicyXSS: chặn script lạ⚠️ Cần cấu hình thêm
X-XSS-ProtectionBộ lọc XSS cũ của trình duyệt
// File: helmet.js
import helmet from 'helmet'

// Thêm toàn bộ security headers mặc định
app.use(helmet())

// Tuỳ chỉnh CSP nếu cần
app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'", 'cdn.jsdelivr.net'],
    styleSrc: ["'self'", "'unsafe-inline'", 'fonts.googleapis.com'],
  },
}))

Rate limiting: chống bot quét API

// File: ratelimit.js
import rateLimit from 'express-rate-limit'

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 phút
  max: 100,                 // tối đa 100 request mỗi IP
  message: { error: 'Quá nhiều request, thử lại sau 15 phút' },
})

// Áp cho toàn app
app.use(limiter)

// Hoặc chỉ cho route nhạy cảm
app.use('/api/auth', rateLimit({ windowMs: 60000, max: 5 }))

❓ CORS chặn request từ domain khác ở đâu?

  • Cấu hình CORS với whitelist domain cụ thể
  • Dùng Helmet để thêm security headers
  • Thiết lập rate limiting cho route nhạy cảm
  • Hiểu CORS là cơ chế trình duyệt, không phải server