Chạy thử một công cụ scan bảo mật cho website congty.vn và bạn rất dễ gặp một danh sách cảnh báo kiểu: Missing Strict-Transport-Security, Content-Security-Policy not set, X-Frame-Options not configured. Nhìn qua có vẻ phức tạp, nhưng thực ra đây chỉ là những dòng response header mà máy chủ web thêm vào mỗi lần trả lời — trình duyệt đọc rồi áp dụng quy tắc bảo mật tương ứng.

Tin vui là phần lớn security headers không cần đụng tới code ứng dụng. Chỉ cần sửa cấu hình Nginx hoặc Apache một lần là xong, và chúng chặn được nhiều kiểu tấn công phổ biến: nhúng trang vào iframe lừa đảo, chạy script độc từ nguồn ngoài, hay buộc trình duyệt quay lại HTTP không mã hóa.

Kiểm tra nhanh ngay: dán URL website vào công cụ kiểm tra security headers, bạn sẽ thấy ngay danh sách headers đang có và thiếu gì. Không cần cài đặt, cũng không cần đăng nhập.

Vì sao security headers quan trọng?

Trình duyệt hiện đại (Chrome, Firefox, Edge) hiểu một bộ header bảo mật chuẩn và thực thi chúng phía client — nghĩa là dù ứng dụng của bạn có lỗ hổng nhỏ, các header này vẫn có thể giảm đáng kể mức độ khai thác được. Dưới đây là 5 header quan trọng nhất:

HeaderBảo vệ khỏiVí dụ giá trị khởi đầuStrict-Transport-Security (HSTS)Buộc dùng HTTPS, chặn downgrade về HTTPmax-age=31536000; includeSubDomainsContent-Security-Policy (CSP)Giới hạn nguồn script/style, chặn XSSdefault-src 'self'X-Frame-OptionsChặn trang bị nhúng vào iframe (clickjacking)DENY hoặc SAMEORIGINX-Content-Type-OptionsNgăn trình duyệt đoán lại MIME typenosniffReferrer-PolicyKiểm soát thông tin referrer rò rỉ ra ngoàistrict-origin-when-cross-origin

Ba header cuối (X-Content-Type-Options, Referrer-Policy, và thêm Permissions-Policy) thường chỉ cần một dòng cấu hình mỗi cái và hiếm khi phá vỡ ứng dụng hiện tại. HSTS và CSP cần thêm chú ý — nhưng hoàn toàn làm được theo từng bước dưới đây.

4 bước kiểm tra và đặt security headers

Bước 1 — Kiểm tra toàn bộ headers hiện tại

Trước khi sửa bất cứ thứ gì, hãy xem website đang trả về những header nào — và thiếu gì so với khuyến nghị.

👉 Kiểm tra: công cụ kiểm tra security headers (nhập URL, xem báo cáo đầy đủ ngay).

Ví dụ: dán https://blog.tencongty.vn vào — nếu công cụ báo thiếu X-Frame-OptionsContent-Security-Policy, bạn đã biết chính xác cần thêm gì thay vì đoán mò.

Lỗi hay gặp:

  • Test trên HTTP thay vì HTTPS: một số header như HSTS chỉ có hiệu lực trên HTTPS — luôn kiểm tra với https://.

  • Chỉ check trang chủ: trang admin hoặc trang /login đôi khi có cấu hình khác. Nên kiểm tra cả các đường dẫn quan trọng.

  • Nhầm header request với header response: security headers là response headers — do máy chủ gửi về trình duyệt, không phải do trình duyệt gửi lên.

Bước 2 — Xem HSTS đã bật và cấu hình đúng chưa

HSTS (HTTP Strict Transport Security) nói với trình duyệt: "Trang này chỉ chấp nhận HTTPS, đừng bao giờ thử kết nối HTTP." Một khi trình duyệt đã nhớ, nó sẽ tự chuyển sang HTTPS ngay cả khi người dùng gõ http:// — không thông qua redirect của server.

👉 Kiểm tra HSTS: công cụ kiểm tra HSTS (xem max-age, includeSubDomains, và preload status).

Thêm HSTS vào Nginx (đặt trong server block hoặc file cấu hình site):

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Muốn thêm X-Frame-Options, X-Content-Type-OptionsReferrer-Policy cùng một lúc:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

Lỗi hay gặp:

  • Đặt max-age quá ngắn (ví dụ max-age=300): header HSTS có tác dụng, nhưng trình duyệt quên sau 5 phút. Khuyến nghị tối thiểu là 1 năm (31536000 giây).

  • Bật includeSubDomains khi chưa có SSL cho toàn bộ subdomain: nếu api.congty.vn hay mail.congty.vn chưa có cert, người dùng sẽ không vào được. Kiểm tra SSL cho hết subdomain trước rồi mới bật dòng này.

  • Thiếu always: trong Nginx, không có always thì header chỉ được thêm vào response 2xx — còn 4xx/5xx thì không.

Bước 3 — Xác định vì sao trình duyệt không hiển thị ổ khóa xanh

Đôi khi bạn đã có SSL nhưng trình duyệt vẫn không hiện biểu tượng ổ khóa đầy đủ, hoặc hiện cảnh báo "Not Secure". Lý do phổ biến nhất là mixed content — trang HTTPS nhúng tài nguyên qua HTTP. Security headers như CSP giúp phát hiện và chặn điều này.

👉 Chẩn đoán: công cụ kiểm tra vì sao không có ổ khóa (tự động phát hiện mixed content và các vấn đề HTTPS).

Ví dụ: công cụ báo http://cdn.tencongty.vn/style.css đang được nhúng trên trang HTTPS — bạn chỉ cần đổi thành https:// là trình duyệt hiển thị ổ khóa đầy đủ trở lại.

Lỗi hay gặp:

  • Mixed content ẩn trong CSS: có thể một file .css nhúng font hay ảnh nền qua HTTP — trình duyệt ít khi báo rõ ràng. Dùng công cụ để quét tự động thay vì mắt thường.

  • Iframe từ nguồn HTTP: dù trang chính dùng HTTPS, nhúng iframe src="http://..." là đủ để mất ổ khóa xanh.

Bước 4 — Kiểm tra SSL đang hoạt động đúng

Security headers chỉ có ý nghĩa khi SSL đang chạy đúng: cert còn hạn, đủ chuỗi chứng chỉ (chain) và khớp với tên miền. Bước này xác nhận nền tảng HTTPS ổn trước khi đặt thêm header.

👉 Kiểm tra SSL: công cụ kiểm tra SSL (xem ngày hết hạn, chain, TLS version).

Lỗi hay gặp:

  • Thiếu intermediate cert: máy chủ trả về cert gốc nhưng không kèm intermediate — một số trình duyệt di động không tự điền thiếu, dẫn đến lỗi chain.

  • Cert wildcard dùng sai: *.congty.vn chỉ phủ một cấp subdomain, không phủ sub.sub.congty.vn.

Sau khi thêm headers thì bao lâu có hiệu lực?

Khác với DNS (cần propagation), security headers có hiệu lực ngay khi bạn reload Nginx/Apache — không cần chờ. Bạn có thể xác nhận ngay bằng cách chạy lại công cụ kiểm tra security headers sau khi cấu hình xong.

Một vài lưu ý về thứ tự triển khai:

  • CSP nên bắt đầu ở chế độ Content-Security-Policy-Report-Only để theo dõi xem có gì bị chặn nhầm không, sau vài ngày mới chuyển sang enforce thật.

  • HSTS sau khi đặt max-age cao, trình duyệt sẽ nhớ trong suốt thời gian đó — rất khó bỏ HTTPS nếu sau này có vấn đề. Vì vậy hãy chắc chắn SSL hoạt động ổn định trước khi bật HSTS với max-age dài.

  • Các header còn lại (X-Frame-Options, X-Content-Type-Options, Referrer-Policy) có thể đặt an toàn ngay — hầu như không phá vỡ ứng dụng hiện tại.

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

Content-Security-Policy phức tạp quá, có cần đặt ngay không? CSP thật sự có thể phức tạp nếu website dùng nhiều nguồn script (Google Analytics, chat widget, CDN…). Bạn có thể bắt đầu bằng cách chỉ đặt X-Frame-Options, X-Content-Type-OptionsHSTS trước — ba cái này đơn giản, hiếm gây vỡ, nhưng đã tăng điểm bảo mật đáng kể. CSP thêm sau khi đã hiểu rõ các nguồn tài nguyên của trang.

Đặt headers qua Nginx hay qua code ứng dụng thì tốt hơn? Cả hai đều được. Đặt ở Nginx thì áp dụng cho toàn bộ response dù ứng dụng viết bằng ngôn ngữ gì, dễ quản lý tập trung. Đặt ở code ứng dụng thì linh hoạt hơn nếu từng route cần headers khác nhau. Thực tế nhiều hệ thống dùng cả hai: Nginx đặt các header chung, ứng dụng ghi đè cho các route đặc thù.

X-Frame-Options nên đặt DENY hay SAMEORIGIN? SAMEORIGIN cho phép nhúng iframe từ cùng tên miền — phù hợp nếu trang của bạn có dùng iframe nội bộ (ví dụ trang admin nhúng báo cáo). DENY là nghiêm ngặt nhất: không cho phép nhúng vào iframe từ bất kỳ nguồn nào. Với website công khai thông thường, SAMEORIGIN là lựa chọn an toàn và ít gây vỡ chức năng hơn.

Kiểm tra headers có cần thêm công cụ khác không? Bộ 4 công cụ trong bài này — kiểm tra headers, HSTS, ổ khóa và SSL — đã phủ được hầu hết những gì cần thiết cho đợt đánh giá ban đầu. Nếu cần báo cáo chi tiết hơn cho pentest hay compliance, bạn có thể chạy thêm scanner chuyên dụng như Mozilla Observatory hoặc securityheaders.com.


BKNS Tools — bộ công cụ bảo mật miễn phí cho webmaster và sysadmin Việt. Kiểm tra security headers · Kiểm tra HSTS · Kiểm tra ổ khóa · Kiểm tra SSL — không cần đăng nhập.