Trang chủTin tứcSecurity headers cho website: 7 header chống tấn công phổ biến
Security headers cho website: 7 header chống tấn công phổ biến
Website của bạn đã có SSL, đã cập nhật CMS, đã đặt mật khẩu mạnh — nhưng khi quét bằng công cụ bảo mật, kết quả vẫn báo "thiếu security headers" với điểm F đỏ chót? Đây là lỗ hổng mà hơn 70% website SME Việt Nam đang mắc phải: bỏ qua security headers website — những HTTP header mà server gửi kèm mỗi

Security headers cho website: 7 header chống tấn công phổ biến

Website của bạn đã có SSL, đã cập nhật CMS, đã đặt mật khẩu mạnh — nhưng khi quét bằng công cụ bảo mật, kết quả vẫn báo "thiếu security headers" với điểm F đỏ chót? Đây là lỗ hổng mà hơn 70% website SME Việt Nam đang mắc phải: bỏ qua security headers website — những HTTP header mà server gửi kèm mỗi phản hồi để "dặn" trình duyệt cách hành xử an toàn.

Tin tốt: triển khai security headers không tốn tiền mua thêm thiết bị, không cần viết lại code — chỉ là vài dòng cấu hình trên web server. Bài viết này giải thích 7 header quan trọng nhất, cách bật trên Nginx/Apache, và cách kiểm tra website của bạn ngay hôm nay.

Security headers website: security headers là gì?

Khi trình duyệt tải website, server không chỉ gửi nội dung trang mà còn gửi kèm các HTTP response header — những dòng metadata "dặn dò" trình duyệt. Trong số đó, security headers là nhóm header chuyên về bảo mật: chúng giới hạn những gì trình duyệt được phép làm với trang web của bạn.

Ví dụ: header X-Frame-Options: DENY dặn trình duyệt "không cho phép trang này nhúng vào iframe của site khác" — chặn đứng tấn công clickjacking. Không có header này, kẻ tấn công có thể nhúng trang thanh toán của bạn vào site giả mạo để đánh cắp thao tác người dùng.

Điểm mấu chốt: security headers không thay thế việc vá lỗ hổng code hay dùng WAF, nhưng là lớp phòng thủ rẻ nhất và dễ triển khai nhất. Chúng đặc biệt hiệu quả chống lại các tấn công nhắm vào trình duyệt người dùng — đúng điểm yếu mà firewall server không che được.

Security headers website: vì sao website SME hay thiếu security headers?

Ba nguyên nhân phổ biến qua thực tế triển khai:

1. Không biết tới. Nhiều website thuê ngoài làm xong là "bàn giao", đơn vị thiết kế không cấu hình header bảo mật vì không nằm trong yêu cầu. Chủ website thì không biết để hỏi.

2. Sợ làm hỏng site. Nỗi lo có thật: cấu hình sai Content-Security-Policy có thể chặn luôn JavaScript hợp lệ, khiến website trắng trang. Vì vậy nhiều admin chọn "kệ nó cho an toàn" — an toàn kiểu... không an toàn.

3. Không có trong checklist bàn giao. SSL thì ai cũng nhớ (trình duyệt báo "không an toàn" rất rõ), nhưng thiếu security headers thì trình duyệt không cảnh báo gì — website vẫn chạy bình thường, chỉ là dễ bị tấn công hơn.

Cách tiếp cận đúng: triển khai từng header một, kiểm tra sau mỗi bước, bắt đầu từ các header "an toàn" (không ảnh hưởng hiển thị) trước khi đụng tới CSP — header mạnh nhất nhưng cũng dễ gây lỗi nhất.

Security headers website: 1. Strict-Transport-Security (HSTS)

Tác dụng: bắt trình duyệt chỉ truy cập website qua HTTPS, chặn tấn công downgrade (kẻ tấn công ép trình duyệt dùng HTTP để nghe lén).

Cấu hình:

Strict-Transport-Security: max-age=31536000; includeSubDomains

Giải thích: max-age=31536000 (1 năm) dặn trình duyệt nhớ trong 1 năm chỉ dùng HTTPS; includeSubDomains áp dụng cho cả subdomain. Chỉ bật header này khi toàn bộ website và subdomain đã chạy HTTPS ổn định — nếu còn trang HTTP, người dùng sẽ không vào được.

Mức độ ưu tiên: cao nhất trong nhóm "an toàn". Bật ngay nếu site đã full HTTPS.

2. Content-Security-Policy (CSP)

Tác dụng: header mạnh nhất — quy định trình duyệt chỉ được tải tài nguyên (script, CSS, ảnh, font) từ những nguồn bạn cho phép. Chặn đứng phần lớn tấn công XSS (chèn mã độc vào trang).

Ví dụ khởi đầu an toàn:

Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'

Triển khai theo 3 bước để không "sập" site: 1. Bật ở chế độ báo cáo trước: dùng Content-Security-Policy-Report-Only để trình duyệt chỉ ghi log vi phạm mà không chặn — chạy 1–2 tuần, thu thập danh sách nguồn tài nguyên thực tế. 2. Phân tích log, bổ sung đủ nguồn hợp lệ (CDN, analytics, chat widget...). 3. Chuyển sang chế độ chặn thật (Content-Security-Policy).

Lưu ý: website dùng nhiều plugin/theme (WordPress) thường cần 'unsafe-inline' cho script — làm giảm hiệu quả CSP nhưng vẫn tốt hơn không có. Mục tiêu dài hạn là loại dần inline script.

Content-Security-Policy chặn tấn công XSS

3. X-Frame-Options

Tác dụng: chống clickjacking — ngăn site khác nhúng trang của bạn vào iframe để lừa người dùng click vào nút ẩn (ví dụ nút "chuyển tiền" đè dưới nút "nhận quà").

Cấu hình:

X-Frame-Options: SAMEORIGIN

Ba giá trị: DENY (cấm tuyệt đối), SAMEORIGIN (chỉ cho phép chính site mình nhúng — phù hợp hầu hết website), ALLOW-FROM (đã lỗi thời, không dùng nữa).

Ngoại lệ: nếu website của bạn cố tình cho đối tác nhúng (ví dụ widget đặt phòng cho đại lý), dùng CSP frame-ancestors thay thế để liệt kê domain được phép cụ thể — linh hoạt và hiện đại hơn X-Frame-Options.

4. X-Content-Type-Options

Tác dụng: ngăn trình duyệt "đoán" loại file (MIME sniffing). Kẻ tấn công có thể upload file độc hại đội lốt ảnh; nếu trình duyệt đoán nhầm thành HTML/JavaScript và thực thi, website bị XSS.

Cấu hình:

X-Content-Type-Options: nosniff

Chỉ một giá trị duy nhất, bật là xong, không ảnh hưởng hiển thị với website cấu hình MIME đúng. Đây là header "bật một lần, quên luôn" — không có lý do gì để thiếu nó.

5. Referrer-Policy

Tác dụng: kiểm soát thông tin trình duyệt gửi cho site khác khi người dùng click link rời khỏi trang bạn (referrer). Không cấu hình, trình duyệt gửi cả URL đầy đủ — có thể lộ token, ID phiên đăng nhập nằm trong URL.

Cấu hình khuyến nghị:

Referrer-Policy: strict-origin-when-cross-origin

Nghĩa là: trong cùng site gửi đầy đủ URL; sang site khác chỉ gửi tên miền (origin). Cân bằng tốt giữa bảo mật và nhu cầu analytics. Các giá trị chặt hơn (no-referrer, same-origin) có thể làm hỏng thống kê nguồn truy cập của đối tác.

6. Permissions-Policy

Tác dụng: (tên cũ: Feature-Policy) tắt các tính năng trình duyệt mà website không dùng: camera, micro, GPS, USB... Giảm bề mặt tấn công nếu website bị chèn mã độc — mã độc không gọi được camera vì trình duyệt đã bị cấm từ đầu.

Ví dụ cho website tin tức/bán hàng thông thường:

Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()

() nghĩa là cấm hoàn toàn. Nếu website có tính năng cần thiết (ví dụ web bán hàng dùng camera quét mã), liệt kê cụ thể: camera=(self).

7. Các header Cross-Origin (COOP/COEP/CORP)

Nhóm header nâng cao, quan trọng với website dùng nhiều tài nguyên cross-origin:

  • Cross-Origin-Opener-Policy (COOP): cách ly ngữ cảnh duyệt web, chống tấn công XS-Leak đánh cắp dữ liệu qua cửa sổ/tab liên kết.
  • Cross-Origin-Embedder-Policy (COEP): yêu cầu tài nguyên nhúng phải explicitly cho phép (qua CORP/CORS) — nền tảng để dùng các tính năng mạnh như SharedArrayBuffer.
  • Cross-Origin-Resource-Policy (CORP): quy định ai được phép tải tài nguyên của bạn.

Khuyến nghị cho SME: bắt đầu với Cross-Origin-Opener-Policy: same-origin (an toàn, ít ảnh hưởng). COEP/CORP chỉ triển khai khi đã hiểu rõ luồng tài nguyên cross-origin của site — cấu hình sai dễ chặn nhầm CDN, font, ảnh.

Bảng tóm tắt 7 security headers

Header Chống lại Độ khó triển khai Ưu tiên
Strict-Transport-Security Nghe lén, downgrade HTTP Dễ ★★★
Content-Security-Policy XSS Khó (cần test kỹ) ★★★
X-Frame-Options Clickjacking Rất dễ ★★★
X-Content-Type-Options MIME sniffing → XSS Rất dễ ★★★
Referrer-Policy Rò rỉ URL/token Dễ ★★
Permissions-Policy Lạm dụng camera/mic/GPS Dễ ★★
COOP/COEP/CORP XS-Leak, tấn công cross-origin Trung bình–khó ★

Cấu hình trên Nginx và Apache

Nginx — thêm vào block server (áp dụng toàn site):

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
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;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
# CSP: bật sau khi đã test ở chế độ Report-Only
# add_header Content-Security-Policy "default-src 'self'; ..." always;

Apache — thêm vào .htaccess hoặc VirtualHost (cần mod_headers):

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"

Lưu ý quan trọng: sau khi sửa cấu hình, chạy nginx -t (hoặc apachectl configtest) rồi mới reload. Và luôn test trên môi trường staging trước khi áp lên production — đặc biệt với CSP.

Kiểm tra và chấm điểm website của bạn

Công cụ miễn phí tốt nhất: securityheaders.com — nhập URL, nhận điểm A+ đến F kèm giải thích từng header thiếu. Quy trình kiểm tra chuẩn:

  1. Quét lần 1 để lấy điểm gốc (hầu hết site SME được D–F).
  2. Bật nhóm header "an toàn" (HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) → quét lại, thường lên B.
  3. Triển khai CSP ở chế độ Report-Only 1–2 tuần → phân tích log.
  4. Bật CSP chính thức → quét lại, mục tiêu A.

Ngoài ra, Mozilla Observatory (observatory.mozilla.org) chấm điểm tổng thể bao quát hơn (gồm cả TLS, cookie...). Nên quét lại mỗi quý hoặc sau mỗi lần nâng cấp website lớn — theme/plugin mới có thể cần điều chỉnh CSP.

Kiểm tra và chấm điểm security headers website

Lỗi thường gặp khi triển khai

1. Quên always trên Nginx. add_header không có always sẽ không gửi header khi server trả lỗi (404, 500...) — đúng lúc cần bảo mật nhất lại thiếu. Luôn thêm always.

2. CSP chặn tài nguyên hợp lệ. Triệu chứng: site mất CSS, nút thanh toán không hiện, bản đồ không tải. Cách xử lý: mở DevTools → Console xem báo lỗi CSP, bổ sung domain vào policy, hoặc quay lại chế độ Report-Only để thu thập tiếp.

3. HSTS bật quá sớm. Bật includeSubDomains khi còn subdomain chạy HTTP (ví dụ blog cũ, staging) sẽ khiến người dùng không truy cập được các subdomain đó. Kiểm tra toàn bộ subdomain trước khi bật.

4. Header trùng lặp. Vừa cấu hình ở Nginx vừa ở code (ví dụ plugin WordPress cũng thêm header) → trình duyệt nhận 2 header mâu thuẫn, hành vi khó đoán. Chọn một nơi duy nhất để quản lý (khuyến nghị: web server).

5. Bật xong rồi quên. Website cập nhật theme/plugin mới dùng CDN mới → CSP cũ chặn → tính năng hỏng mà không ai hiểu vì sao. Đưa "rà soát security headers" vào checklist sau mỗi lần nâng cấp lớn.

Lộ trình triển khai 30 ngày cho SME

Nếu đội kỹ thuật chỉ có 1–2 người kiêm nhiệm, đừng cố làm hết trong một buổi. Lộ trình 4 tuần sau vừa sức mà vẫn đạt điểm A:

Tuần 1 — Nhóm "bật là xong". Triển khai 4 header không ảnh hưởng hiển thị: X-Content-Type-Options, X-Frame-Options: SAMEORIGIN, Referrer-Policy, Permissions-Policy. Mỗi header bật xong quét lại securityheaders.com để xác nhận. Cuối tuần 1, điểm thường từ F lên C.

Tuần 2 — HSTS. Kiểm tra toàn bộ subdomain đã HTTPS (dùng công cụ quét subdomain miễn phí), sau đó bật HSTS với max-age tăng dần: tuần đầu để 1 ngày (86400), ổn định thì nâng lên 1 tháng, rồi 1 năm. Cách tăng dần này giúp rollback nhanh nếu phát hiện subdomain còn HTTP.

Tuần 3–4 — CSP. Bật Content-Security-Policy-Report-Only, thu thập log 2 tuần. Cuối tuần 4, phân tích log, viết policy chính thức, bật chặn thật vào giờ thấp điểm (ví dụ sáng sớm), và trực canh 2–3 giờ đầu để xử lý nếu có tài nguyên bị chặn nhầm.

Sau 30 ngày: điểm A trên securityheaders.com, quét lại Mozilla Observatory để chấm tổng thể, và đưa "kiểm tra headers" vào checklist sau mỗi lần nâng cấp website lớn. Tổng công sức: khoảng 8–12 giờ làm việc rải trong 1 tháng — khoản đầu tư bảo mật rẻ nhất mà SME có thể làm.

Kết luận

Security headers website là lớp bảo mật có tỷ lệ "hiệu quả trên công sức" cao nhất: vài dòng cấu hình, không tốn thêm chi phí, chặn được cả loạt tấn công nhắm vào trình duyệt người dùng. Với 7 header trong bài — bắt đầu từ nhóm dễ (HSTS, X-Frame-Options, X-Content-Type-Options) rồi tiến tới CSP — website SME hoàn toàn có thể đạt điểm A trên securityheaders.com trong một buổi chiều.

Nếu đội kỹ thuật của bạn đang quá tải, hạ tầng của SunCloud (Cloud Server, VPS) cho phép bạn toàn quyền cấu hình web server, kèm snapshot backup trước mỗi lần thay đổi để rollback trong vài phút nếu cấu hình sai. Liên hệ hotline 083 979 3434 hoặc email sales@suncloud.vn hoặc truy cập suncloud.vn để được tư vấn.

Bài viết liên quan

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

Security headers có thay thế SSL không?

Không — ngược lại, HSTS còn yêu cầu website đã chạy HTTPS hoàn chỉnh. Security headers và SSL bổ trợ nhau: SSL mã hóa đường truyền, headers dặn trình duyệt hành xử an toàn. Thiếu một trong hai đều là lỗ hổng.

Bật security headers có làm chậm website không?

Không đáng kể. Header chỉ là vài chục byte thêm vào mỗi phản hồi HTTP — tác động hiệu năng gần như bằng không. Lợi ích bảo mật vượt xa chi phí này.

Website WordPress bật CSP có khó không?

Khó hơn site code tay vì theme/plugin dùng nhiều nguồn tài nguyên khác nhau. Bí quyết là chạy chế độ Content-Security-Policy-Report-Only 2–4 tuần để thu thập đủ danh sách, rồi mới bật chặn thật. Có plugin hỗ trợ thu thập log CSP cho WordPress.

Điểm A+ trên securityheaders.com có đủ an toàn chưa?

Chưa đủ — đó mới chỉ là "bài kiểm tra headers". Website vẫn cần: cập nhật CMS/plugin, mật khẩu mạnh + 2FA, backup định kỳ, WAF cho site quan trọng, và quét lỗ hổng tổng thể (Mozilla Observatory). Security headers là một lớp trong nhiều lớp phòng thủ.

Có nên thuê ngoài việc này không?

Với 5 header cơ bản, admin hệ thống làm được trong 1–2 giờ. Riêng CSP cho website phức tạp (nhiều tích hợp bên thứ ba) nên có người am hiểu HTTP header hỗ trợ, hoặc triển khai từng bước theo quy trình 3 bước trong bài.

Header nào quan trọng nhất nếu chỉ được chọn một?

Content-Security-Policy — vì chặn được XSS, loại tấn công web phổ biến và nguy hiểm nhất. Nhưng nếu e ngại độ phức tạp của CSP, hãy bắt đầu với Strict-Transport-Security + X-Frame-Options: dễ triển khai, hiệu quả ngay.

Tác giả:
Ảnh đại diện của Trường Phạm
Tôi là Trường Phạm, hiện đảm nhiệm vai trò CEO của SunCloud. Với kiến ​​thức sâu rộng về mạng lưới hệ thống, điện toán đám mây và an ninh mạng, góp phần định hướng chiến lược phát triển bền vững cho doanh nghiệp. Tôi đã điều hành SunCloud phát triển và vận hành thành công hàng loạt dự án thực tiễn, mang lại giá trị thực tế cho các doanh nghiệp và cơ sở kinh doanh. Bản thân tôi đã đạt được các chứng chỉ quốc tế uy tín như CCNP, LPI, VCP và không ngừng học hỏi để nâng cao năng lực quản lý cũng như chuyên môn mỗi ngày. Đam mê công nghệ và khao khát cống hiến, tôi luôn nỗ lực xây dựng SunCloud trở thành một hệ sinh thái công nghệ đáng tin cậy, đồng thời lan tỏa những giá trị tri thức hữu ích đến cộng đồng.

Tin tức nổi bật