Triển khai Security Headers, CSP và HSTS không làm vỡ Website

Security headers cho WordPress với Content-Security-Policy, HSTS, nosniff, Referrer-Policy và Permissions-Policy

Security headers có thể tăng đáng kể khả năng phòng thủ ở browser, nhưng rollout sai có thể làm hỏng chính website cần bảo vệ. Content Security Policy (CSP) quá chặt có thể block JavaScript, font, analytics, payment widget hoặc WordPress admin flow; HSTS bật quá sớm với includeSubDomains hoặc preload có thể khiến subdomain chưa sẵn sàng HTTPS bị inaccessible.

MDN và OWASP đều khuyến nghị thử CSP bằng Content-Security-Policy-Report-Only trước khi enforce để quan sát violation mà chưa block resource. Với HSTS, OWASP khuyến nghị bắt đầu bằng max-age ngắn trong giai đoạn đầu và cảnh báo rằng includeSubDomains/preload có blast radius lớn nếu một subdomain vẫn cần HTTP. Nguồn: MDN — Content Security Policy, OWASP — CSP Cheat Sheet và OWASP — HSTS Cheat Sheet.

Bối cảnh: hardening header nhưng không được phép phá frontend

Giả sử một WordPress production site dùng theme, plugin, CDN, analytics, chat widget và payment integration. Security audit đề xuất CSP, HSTS, X-Content-Type-Options, Referrer-Policy và Permissions-Policy. Nếu áp một policy “strict” trực tiếp lên production mà chưa inventory dependency, frontend có thể mất script, checkout không chạy hoặc admin editor lỗi.

Những failure mode thường gặp

  • CSP block inline script/style mà theme hoặc plugin vẫn đang dùng.
  • Third-party script domain chưa có trong policy.
  • Font/image/API endpoint bị chặn do directive quá hẹp.
  • frame-ancestors làm hỏng legitimate embedding.
  • HSTS includeSubDomains ảnh hưởng subdomain chưa có HTTPS.
  • HSTS preload được bật trước khi toàn bộ domain tree sẵn sàng lâu dài.

Bước 1: inventory resource và HTTPS readiness trước khi thay header

Trước CSP, cần inventory script, style, image, font, frame, connect/API, worker và form destination thực sự được dùng. Với WordPress, dependency có thể đến từ core, theme, plugin, CDN hoặc service bên thứ ba. Mục tiêu là phân biệt resource cần thiết với resource chỉ xuất hiện do legacy hoặc tracking không còn dùng.

Trước HSTS, cần kiểm tra certificate, redirect HTTP→HTTPS, mixed content, CDN/reverse proxy và đặc biệt mọi subdomain nếu dự định bật includeSubDomains. Tham chiếu HTTPS/TLS WordPress an toàn để khóa phần transport trước khi tăng HSTS.

Bước 2: triển khai CSP ở Report-Only trước khi enforce

MDN khuyến nghị dùng Content-Security-Policy-Report-Only để test policy tương lai mà không block resource. Violation report và browser console giúp xác định directive nào sẽ gây regression nếu enforce ngay. Với baseline và quy trình rollout chi tiết, xem Content Security Policy là gì? Cách triển khai CSP an toàn.

Đọc violation theo dependency thật, không whitelist vô hạn

Không nên thấy domain bị block là thêm ngay vào allowlist. Mỗi violation cần trả lời: resource này thuộc business flow nào, owner là ai, có cần thiết không và có alternative an toàn hơn không. Nếu cứ mở CSP theo mọi violation, policy sẽ dần mất giá trị.

MDN hiện ưu tiên strict CSP dựa trên nonce hoặc hash hơn allowlist domain dài và khó kiểm soát. Tuy nhiên rollout WordPress thực tế có thể cần phase chuyển tiếp, đặc biệt khi theme/plugin còn inline code.

Bước 3: pilot enforce theo route quan trọng

Sau khi Report-Only ổn định, không nhất thiết phải enforce toàn site cùng lúc. Có thể pilot trên một nhóm route hoặc staging clone có traffic/browsing coverage tương đương, sau đó mở dần production.

  • Homepage và content page.
  • Login/admin flow.
  • Search/form/contact.
  • Checkout/payment nếu có.
  • Third-party embed/chat/analytics.
  • Mobile browser và major desktop browsers.

Policy nên được validate cả browser console lẫn business flow. “Không có CSP violation” không đảm bảo website đúng chức năng nếu test coverage thiếu.

Bước 4: rollout HSTS theo mức rủi ro tăng dần

Bắt đầu max-age ngắn

OWASP khuyến nghị trong rollout ban đầu có thể dùng Strict-Transport-Security: max-age=86400 để giảm hậu quả nếu phát hiện cấu hình sai. Khi đã xác minh HTTPS hoạt động ổn định, có thể tăng dần max-age. Hướng dẫn chi tiết về max-age, includeSubDomains và preload nằm tại HSTS là gì? Khi nào nên bật Strict-Transport-Security.

Chỉ dùng includeSubDomains và preload khi domain tree sẵn sàng

includeSubDomains áp HSTS cho subdomain; vì vậy một staging, legacy app hoặc service cũ chưa có HTTPS có thể bị ảnh hưởng. preload còn có tác động dài hơn vì domain được browser biết trước là HTTPS-only. OWASP cảnh báo preload có thể gây hậu quả đáng kể nếu sau đó cần quay về HTTP hoặc subdomain chưa tương thích.

Các security headers khác nên rollout cùng validation

OWASP HTTP Headers Cheat Sheet khuyến nghị kết hợp nhiều response headers thay vì kỳ vọng CSP hoặc HSTS giải quyết mọi vấn đề.

  • X-Content-Type-Options: nosniff để giảm MIME sniffing.
  • Referrer-Policy để giới hạn referrer data bị gửi ra ngoài.
  • Permissions-Policy để hạn chế browser capabilities không cần thiết.
  • frame-ancestors trong CSP để kiểm soát embedding/clickjacking.

Xem Security Headers cho WordPress để tham chiếu vai trò của từng header; case này tập trung vào cách rollout không gây regression.

Validation matrix trước khi mở rộng policy

GateĐiều kiện PASS
CSP Report-OnlyViolation đã được phân loại và xử lý
CSP enforceKhông block business-critical resource
FrontendTheme, script, font, image hiển thị đúng
Admin/loginĐăng nhập, editor, upload hoạt động
Third-partyPayment/chat/analytics cần thiết hoạt động
HTTPSRedirect, certificate, mixed content PASS
HSTSSubdomain readiness được xác minh trước includeSubDomains/preload

Trước go-live hoặc thay đổi policy lớn, có thể dùng Checklist bảo mật WordPress trước khi go-live làm regression gate bổ sung.

Monitoring sau rollout

Sau khi CSP enforce, vẫn nên theo dõi violation report và frontend error để phát hiện dependency mới từ plugin/theme update. HSTS cần được review khi thêm subdomain, chuyển CDN, thay TLS termination hoặc architecture.

Security header là configuration state nên có owner và change review. Dùng Security Monitoring WordPress để đưa violation/error/config change vào baseline vận hành thay vì chỉ kiểm tra một lần khi triển khai.

Bài học vận hành

  • CSP nên được test bằng Report-Only trước enforce.
  • Violation không đồng nghĩa resource phải được whitelist.
  • Strict CSP với nonce/hash thường bền vững hơn allowlist phình to.
  • HSTS rollout nên bắt đầu với max-age ngắn rồi tăng dần.
  • includeSubDomains và preload chỉ phù hợp khi toàn bộ domain tree sẵn sàng HTTPS.
  • Security header rollout phải có functional regression testing, monitoring và rollback plan.

Nguồn tham khảo

◇
Cần hỗ trợ kiểm tra và xử lý website?Đội ngũ SecureWebOps sẵn sàng hỗ trợ theo phạm vi phù hợp.
Liên hệ ngay →
Đoàn Trình Dục
Về tác giả Đoàn Trình Dục TD Digital · Website Operations & Security

Đoàn Trình Dục là tác giả nội dung trên SecureWebOps. Các bài viết tập trung vào bảo mật WordPress, giám sát an ninh website, malware/backdoor, hardening, backup/recovery và Incident Response theo hướng thực hành, có bước kiểm tra, bằng chứng, validation và rollback khi phù hợp.

Xem hồ sơ tác giả →