Phần lớn chủ website chỉ biết mình có lỗ hổng vào đúng ngày lỗ hổng đó bị khai thác. Trước đó mọi thứ vẫn chạy bình thường: trang vẫn lên, đơn vẫn về, không có đèn đỏ nào nhấp nháy.
Bài này không giải thích SQL injection hay XSS là gì. Đây là một checklist bảo mật website gồm 20 mục, dành cho người không biết code — chủ doanh nghiệp, trưởng phòng kinh doanh, kế toán kiêm luôn việc quản trị website — tự chạy hết trong khoảng 30 phút bằng trình duyệt và vài công cụ miễn phí. Mỗi mục có đúng ba thứ: kiểm bằng gì, thấy gì thì tính là đạt, không đạt thì làm gì.
Cuối bài là thang chấm điểm. Bạn rời trang này với một con số và danh sách việc phải làm theo thứ tự, không phải với thêm một mớ kiến thức.
Cách dùng checklist bảo mật website này: 30 phút, không cần kỹ thuật
Chuẩn bị bốn thứ trước khi bấm giờ: tài khoản quản trị website, quyền đăng nhập panel hosting, một trình duyệt và điện thoại. Nếu bạn không có quyền vào panel hosting, hãy gọi đơn vị đang quản trị website xin quyền xem — riêng việc bạn không có quyền đó đã là một phát hiện đáng ghi lại.
Quy tắc chấm: mỗi mục 1 điểm nếu đạt, 0 điểm nếu không đạt. Mục nào bạn không chắc thì tính 0. Bảo mật không cộng điểm cho sự may rủi, "chắc là có backup" và "có backup" là hai trạng thái khác nhau hoàn toàn.
Bốn mục đánh dấu (!) là mục chí mạng. Rớt bất kỳ mục nào trong đó thì dù tổng điểm bao nhiêu, kết quả vẫn bị hạ xuống mức "Yếu".
Trong 30 phút này bạn chỉ kiểm và ghi kết quả, không sửa. Sửa giữa chừng là cách chắc chắn nhất để hết buổi chiều mà mới xong nhóm 1. Phần "vì sao lỗ hổng này nguy hiểm" chúng tôi cố tình cắt xuống một câu mỗi mục; muốn hiểu cơ chế phía sau thì đọc những lỗ hổng bảo mật website âm thầm khiến bạn mất sạch dữ liệu sau khi chấm xong.
Nhóm 1 — Truy cập: mật khẩu, 2FA, phân quyền admin (5 mục, 8 phút)
Nhóm chấm nhanh nhất, cũng là nhóm hỏng nhiều nhất trong các tình huống ứng cứu chúng tôi thường gặp. Phần lớn vụ chiếm quyền website không bắt đầu bằng kỹ thuật tấn công tinh vi nào cả. Nó bắt đầu bằng một tài khoản admin đáng lẽ phải bị xóa từ năm ngoái.
| # | Hạng mục | Kiểm bằng gì | Đạt khi | Không đạt thì làm gì |
|---|---|---|---|---|
| 1 | Số tài khoản quản trị | Mục Users, lọc vai trò Administrator (2 phút) | Từ 3 admin trở xuống, mỗi tài khoản là một người thật đang làm việc | Hạ quyền xuống Editor, xóa tài khoản không ai nhận |
| 2 | Tài khoản người đã nghỉ | Đối chiếu user với danh sách nhân sự, gồm cả bên làm web cũ (2 phút) | Không còn tài khoản của người đã nghỉ hay đối tác hết hợp đồng | Xóa ngay, đổi mật khẩu các tài khoản còn lại |
| 3 | Xác thực 2 lớp cho admin (!) | Cài đặt bảo mật của CMS hoặc plugin 2FA (1 phút) | Mọi admin đều phải nhập mã OTP khi đăng nhập | Bật 2FA cho toàn bộ admin hôm nay, mất khoảng 15 phút |
| 4 | Mật khẩu đã rò rỉ nơi khác | Nhập email công ty vào haveibeenpwned.com (2 phút) | Không có kết quả, hoặc mật khẩu bị lộ chưa từng dùng cho website | Đổi mật khẩu website và email, ngừng dùng chung một mật khẩu |
| 5 | Chặn dò mật khẩu | Đăng xuất, cố tình nhập sai 6 lần (1 phút) | Bị khóa tạm, hiện captcha hoặc chặn theo IP | Cài plugin giới hạn đăng nhập sai, đổi đường dẫn trang đăng nhập |
"Ba admin" không phải con số thiêng liêng, nhưng nguyên tắc thì có: mỗi tài khoản quản trị là một cánh cửa, và bạn phải trả lời được cửa đó thuộc về ai. Doanh nghiệp 20 người mà website có 9 admin nghĩa là không ai đang quản lý quyền truy cập.
Nhóm 2 — Hạ tầng: SSL, cập nhật, hosting (6 mục, 10 phút)
Nhóm này kiểm được gần như hoàn toàn từ bên ngoài, không cần đăng nhập, làm được ngay cả với website do đơn vị khác quản trị.
| # | Hạng mục | Kiểm bằng gì | Đạt khi | Không đạt thì làm gì |
|---|---|---|---|---|
| 6 | Chứng chỉ SSL | Nhập tên miền vào ssllabs.com/ssltest (3 phút) | Điểm A trở lên, còn hạn trên 15 ngày, đã tắt TLS 1.0/1.1 | Gia hạn hoặc cài lại chứng chỉ, yêu cầu tắt giao thức cũ |
| 7 | Toàn site chạy HTTPS | Gõ http://tenmien.com xem có tự chuyển không (1 phút) | Tự chuyển HTTPS ở mọi trang, không cảnh báo "không an toàn" | Bật chuyển hướng 301 toàn site, sửa liên kết ảnh còn gọi qua http |
| 8 | Phiên bản CMS, plugin, theme (!) | Mục Cập nhật trong trang quản trị (2 phút) | Không còn bản vá bảo mật đang chờ, không plugin bỏ hoang trên 12 tháng | Sao lưu rồi cập nhật, gỡ hẳn plugin không dùng thay vì chỉ tắt |
| 9 | Phiên bản PHP hoặc runtime | Panel hosting, mục PHP Version (1 phút) | Phiên bản còn được vá bảo mật, PHP 8.2 trở lên tại thời điểm viết | Thử tương thích trên bản sao rồi nâng; PHP 7.x, 8.0, 8.1 đã hết hạn vá |
| 10 | File nhạy cảm lộ ra ngoài | Gõ /.git/config, /.env, /backup.zip, /wp-config.php.bak (2 phút) | Tất cả trả về 404 hoặc 403 | Xóa file backup và thư mục .git khỏi thư mục web, chặn ở cấu hình |
| 11 | Security headers | Nhập tên miền vào securityheaders.com (1 phút) | Hạng B trở lên, có HSTS và chống nhúng iframe | Nhờ kỹ thuật thêm header, đây là sửa cấu hình chứ không đụng vào code |
Nếu website của bạn có đăng nhập cho khách, thanh toán trực tuyến hay dữ liệu cá nhân, hãy cân nhắc thêm một lớp lọc phía trước. Khi nào lớp đó đáng tiền và khi nào là thừa, chúng tôi phân tích trong bài WAF là gì và website có thật sự cần không.
Nhóm 3 — Dữ liệu: backup có chạy thật không, đã thử restore bao giờ chưa (4 mục, 7 phút)
Nhóm ít mục nhất nhưng quyết định nhiều nhất. Khi mọi thứ đã hỏng, backup là thứ duy nhất phân biệt giữa "mất một buổi chiều" và "mất sạch cơ sở dữ liệu khách hàng".
| # | Hạng mục | Kiểm bằng gì | Đạt khi | Không đạt thì làm gì |
|---|---|---|---|---|
| 12 | Backup chạy tự động | Panel hosting hoặc plugin backup, xem lịch sử (2 phút) | Bản gần nhất không cũ quá 24 giờ, trạng thái thành công | Bật backup hằng ngày, bật email báo khi một lần backup thất bại |
| 13 | Backup nằm ngoài máy chủ website (!) | Xem đường dẫn lưu trữ bản backup (2 phút) | Có bản sao ở nơi khác: cloud storage, máy chủ riêng, ổ cứng ngoài văn phòng | Đẩy backup sang nơi thứ hai; backup cùng ổ đĩa sẽ mất cùng website |
| 14 | Số bản lưu và thời gian giữ | Đếm số bản trong kho lưu trữ (1 phút) | Giữ tối thiểu 14 ngày, tốt hơn là 30 ngày | Tăng thời gian lưu; mã độc thường nằm im vài tuần trước khi kích hoạt |
| 15 | Đã từng khôi phục thử (!) | Tự trả lời: lần gần nhất có người bung backup và mở được website từ nó (1 phút) | Trong 6 tháng gần đây đã restore thử thành công và biết việc đó mất bao lâu | Đặt lịch diễn tập khôi phục tháng này, làm trên môi trường tách riêng |
Mục 15 là mục đáng nhớ nhất cả bài: backup có chạy hay không chưa quan trọng bằng đã thử restore bao giờ chưa. Tình huống điển hình là backup chạy đều suốt nhiều tháng, log toàn màu xanh, nhưng đến lúc cần thì file chỉ có mã nguồn mà thiếu cơ sở dữ liệu, hoặc bản dump hỏng từ lâu mà không ai biết vì chưa ai mở ra.
Một bản backup chưa từng được khôi phục thử không phải là backup. Đó là một niềm tin. Cách bố trí số bản sao và nơi lưu cho đúng, xem quy tắc backup dữ liệu 3-2-1 áp dụng thực tế. Trên các gói máy chủ chúng tôi vận hành, backup hằng ngày và giữ 30 ngày là cấu hình mặc định, đúng vì lý do ở mục 14.
Nhóm 4 — Giám sát: biết mình bị tấn công bằng cách nào (5 mục, 5 phút)
Phần lớn website bị xâm nhập không sập. Nó vẫn chạy, vẫn bán hàng, chỉ là đang phục vụ thêm một ông chủ nữa. Câu hỏi của nhóm này rất cụ thể: nếu chuyện đó xảy ra tối nay, bao lâu sau bạn biết?
| # | Hạng mục | Kiểm bằng gì | Đạt khi | Không đạt thì làm gì |
|---|---|---|---|---|
| 16 | Nhật ký đăng nhập | Mục Logs hoặc Activity trong trang quản trị (1 phút) | Xem được ai đăng nhập lúc nào, từ IP nào, trong ít nhất 30 ngày | Cài plugin activity log; không có log thì sau sự cố không truy được đường vào |
| 17 | Cảnh báo website chết | Kiểm có dịch vụ giám sát nào gửi cảnh báo về điện thoại không (1 phút) | Có công cụ ping mỗi 5 phút, báo qua SMS, email hoặc Telegram | Đăng ký dịch vụ giám sát uptime miễn phí, cấu hình dưới 10 phút |
| 18 | Bị đưa vào danh sách đen | Tra tên miền trên transparencyreport.google.com (1 phút) | Không có cảnh báo, trình duyệt không hiện màn hình đỏ với khách | Xử lý mã độc rồi gửi yêu cầu xem xét lại, chậm là mất thứ hạng tìm kiếm |
| 19 | Trang lạ được lập chỉ mục | Tìm Google với cú pháp site:tenmien.com (1 phút) | Không có URL lạ, không trang tiếng nước ngoài, cờ bạc, thuốc | Dấu hiệu website đã bị chèn nội dung rác, xử lý theo quy trình ứng cứu |
| 20 | Có người chịu trách nhiệm | Tự trả lời: 2 giờ sáng thứ Bảy website bị hạ, bạn gọi số nào (1 phút) | Có tên đơn vị, số điện thoại và cam kết thời gian phản hồi bằng văn bản | Chốt đầu mối kỹ thuật và mức cam kết phản hồi vào hợp đồng |
Mục 19 hay gây bất ngờ nhất. Không hiếm trường hợp website bị chèn hàng nghìn trang rác đã nằm trên Google từ vài tháng trước, chủ website không biết vì trang chủ vẫn hiển thị bình thường. Thấy dấu hiệu đó thì đừng chấm tiếp, chuyển thẳng sang quy trình xử lý website bị hack trong 24 giờ đầu.
Với mục 20, cam kết phản hồi nên nằm trong hợp đồng chứ không nằm trong lời hứa miệng. Chúng tôi cam kết phản hồi sự cố mức P1 trong 15 phút và trực 24/7. Con số có thể khác nhau giữa các nhà cung cấp, nhưng nếu hợp đồng của bạn không ghi con số nào cả thì đó chính là câu trả lời.
Chấm điểm bảo mật website: bao nhiêu là ổn, bao nhiêu là báo động
Cộng tổng số mục đạt, tối đa 20 điểm.
| Điểm | Mức | Nghĩa là gì | Việc cần làm trong 30 ngày tới |
|---|---|---|---|
| 18 – 20 | Tốt | Đã chặn gần hết đường tấn công phổ thông, rủi ro còn lại ở tầng ứng dụng | Kiểm thử chuyên sâu, rà soát phân quyền và luồng thanh toán |
| 14 – 17 | Khá, còn lỗ | Không có lỗ hổng chí mạng nhưng còn cửa mở, đủ để quét tự động tìm ra | Đóng hết mục 0 điểm ở nhóm 1 và 2, ưu tiên cập nhật và phân quyền |
| 9 – 13 | Yếu | Xác suất bị xâm nhập trong 12 tháng tới là đáng kể | Rà soát toàn bộ nhóm 1 và nhóm 3 ngay trong tuần này |
| 0 – 8 | Báo động | Website đang mở, giả định đã có người vào cho tới khi chứng minh ngược lại | Kiểm dấu hiệu xâm nhập, dựng lại từ backup sạch, rồi mới vá |
Quy tắc chặn: rớt bất kỳ mục (!) nào — mục 3, 8, 13, 15 — thì mức cao nhất bạn nhận được là "Yếu", kể cả khi tổng điểm là 19. Không bật 2FA, không cập nhật, backup nằm cùng máy chủ, backup chưa từng thử khôi phục: mỗi thứ đều đủ sức biến một sự cố nhỏ thành mất dữ liệu vĩnh viễn.
Nếu bạn đạt 18 – 20, checklist này đã hết tác dụng với bạn. Phần còn lại là lỗi logic trong chính ứng dụng: một API trả về đơn hàng của khách khác, một trang không kiểm tra quyền khi truy cập trực tiếp bằng URL. Loại lỗi đó không công cụ miễn phí nào tìm ra, phải có người kiểm thử thủ công — các dấu hiệu cho thấy đã đến lúc đó nằm trong bài doanh nghiệp nhỏ có cần pentest không.
Về chi phí, phần lớn mục trong bảng sửa được bằng thời gian chứ không phải bằng tiền: bật 2FA, xóa tài khoản thừa, cập nhật plugin, đổi nơi lưu backup đều miễn phí. Chỉ khi cần chuyển sang hạ tầng có giám sát và backup tự động mới phát sinh chi phí. Gói máy chủ ảo cho website doanh nghiệp nhỏ hiện khởi điểm từ 199.000đ/tháng, còn dịch vụ theo dõi và vá định kỳ hằng tháng trên thị trường thường nằm khoảng 1.500.000đ – 6.000.000đ/tháng tùy số website và mức cam kết phản hồi. Đây là khoảng tham khảo thị trường tại thời điểm viết (08/2026), chưa gồm VAT.
Ba việc làm ngay sau khi chấm xong
- Đóng các mục (!) trước. Bật 2FA và đưa backup ra khỏi máy chủ website là hai việc xong trong một buổi chiều, và chúng chặn phần lớn kịch bản xấu nhất.
- Dọn tài khoản. Xóa admin không ai nhận, hạ quyền người chỉ cần đăng bài. Không tốn đồng nào, loại bỏ đúng con đường tấn công phổ biến nhất.
- Đặt lịch chạy lại checklist. Mỗi quý một lần, bắt buộc chạy lại sau khi đổi đơn vị quản trị hoặc có người phụ trách kỹ thuật nghỉ việc.
Ghi lại điểm số kèm ngày tháng. Ba tháng sau chấm lại, chênh lệch giữa hai con số cho bạn biết việc bảo trì có thực sự diễn ra hay chỉ nằm trên hợp đồng.
Chấm xong mà chưa rõ nên xử lý mục nào trước, hoặc cần người rà lại hạ tầng đang chạy, gọi hotline 0919 788 815 để được tư vấn miễn phí — kỹ sư của chúng tôi sẽ xem kết quả cùng bạn. Bạn cũng có thể tham khảo dịch vụ máy chủ và vận hành hệ thống hoặc gửi thông tin qua form trên microads.vn.