Lập trình

Checklist header bảo mật HTTP (kèm cấu hình copy-paste)

Chỉ với vài header phản hồi, bạn có thể chặn cả nhóm tấn công như clickjacking, MIME sniffing, hạ cấp giao thức và phần lớn XSS, gần như không tốn chi phí. Dưới đây là những header nên gửi, giá trị khởi đầu an toàn, và cách triển khai CSP, header phức tạp nhất, mà không làm hỏng website của bạn.

Trung cấp · 8 phút đọc · Cập nhật 30 tháng 10, 2026

Checklist header bảo mật HTTP (kèm cấu hình copy-paste)

Checklist

HeaderGiá trị an toànBảo vệ khỏi
Strict-Transport-Securitymax-age=31536000; includeSubDomainsHạ cấp HTTPS và đánh cắp cookie trên Wi-Fi công cộng
Content-Security-PolicyBắt đầu ở chế độ report-only (xem bên dưới)XSS, script bị chèn vào, rò rỉ dữ liệu
X-Content-Type-OptionsnosniffTrình duyệt chạy file tải lên như script
CSP frame-ancestors'self' (hoặc X-Frame-Options: SAMEORIGIN)Clickjacking
Referrer-Policystrict-origin-when-cross-originRò rỉ toàn bộ URL (token, ID) sang website khác
Permissions-Policycamera=(), microphone=(), geolocation=()Script bên thứ ba sử dụng tính năng thiết bị

Xem website của bạn đang gửi những header nào, kèm điểm đánh giá, trong Security Headers Checker.

HSTS: bắt đầu với thời gian ngắn

Khi trình duyệt nhận được HSTS, nó sẽ từ chối HTTP thường trong suốt thời gian max-age. Trước tiên, hãy đảm bảo mọi subdomain đều hoạt động qua HTTPS (kiểm tra chứng chỉ bằng SSL Checker), bắt đầu với max-age=300, sau đó tăng lên một năm. Chỉ thêm preload và gửi lên danh sách HSTS preload khi bạn thật sự chắc chắn, vì việc gỡ bỏ có thể mất nhiều tháng.

Content-Security-Policy mà không làm hỏng website

CSP quy định script, style, hình ảnh và kết nối được phép tải từ đâu. Hãy triển khai ở chế độ report-only, tức là chỉ ghi lại vi phạm chứ không chặn bất cứ thứ gì:

Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; report-uri /csp-report

Theo dõi console trình duyệt và endpoint nhận báo cáo trong một tuần, thêm các nguồn bạn thực sự dùng, sau đó đổi tên header thành Content-Security-Policy. Tránh dùng 'unsafe-inline' cho script; với các script inline do bạn kiểm soát, hãy dùng nonce hoặc hash. Bạn có thể xây dựng policy từng nguồn một bằng CSP Generator.

Cấu hình

Nginx (bên trong server; always giúp header vẫn có mặt ở các trang lỗi):

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "frame-ancestors 'self'" always;

Apache (.htaccess, với mod_headers):

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"

Vercel (vercel.json):

{ "headers": [ { "source": "/(.*)", "headers": [
  { "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains" },
  { "key": "X-Content-Type-Options", "value": "nosniff" },
  { "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
] } ] }

Tạo cấu hình server đầy đủ với Nginx Config Generator hoặc .htaccess Generator.

Những header có thể bỏ

X-XSS-Protection đã lỗi thời. Các trình duyệt hiện đại đã gỡ bộ lọc mà nó điều khiển, và nếu vẫn gửi thì giá trị khuyến nghị là 0. Expect-CT đã bị loại bỏ. Ẩn Server và X-Powered-By là thói quen tốt nhưng không phải biện pháp bảo vệ thực sự.

Câu hỏi thường gặp

Những header bảo mật nào quan trọng nhất?
Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options: nosniff và frame-ancestors (hoặc X-Frame-Options). Referrer-Policy và Permissions-Policy là những cải thiện nhanh, dễ làm.
Content-Security-Policy có làm hỏng website của tôi không?
Có thể, nếu bạn áp dụng ngay lập tức. Hãy bắt đầu với Content-Security-Policy-Report-Only, sửa những gì được báo cáo, rồi mới chuyển sang áp dụng chính thức.
X-Frame-Options có còn cần thiết không?
Trên trình duyệt hiện đại, CSP frame-ancestors đã thay thế nó. Gửi cả hai vẫn ổn để tương thích với trình duyệt cũ.

Đọc tiếp