Tất cả bài viết
12 tháng 3, 2026·7 phút đọc·Long Nguyen · CTO, ERPFit·Cập nhật 17 tháng 6, 2026
wordpresssecuritychecklist
Bảo mật WordPress: checklist 9 bước cho mọi website

Bảo mật WordPress: checklist 9 bước cho mọi website

Checklist bảo mật WordPress 9 bước: sửa file permissions, chặn XML-RPC, bật 2FA, HTTP headers, backup offsite. Đúc kết từ hàng chục site bị hack thực tế.

Mục lục

WordPress chiếm khoảng 43% toàn bộ website trên web (W3Techs, 2026). Điều đó cũng có nghĩa là nó là mục tiêu phổ biến nhất. Chúng tôi đã xử lý nhiều website WordPress bị hack — mã độc chèn vào core files, redirect sang trang lừa đảo, backdoor ẩn trong plugin. Bài viết này chia sẻ checklist bảo mật mà chúng tôi áp dụng cho mọi website khách hàng.

Đây không phải lý thuyết. Mỗi mục trong checklist này đều có nguồn gốc từ một sự cố thực tế mà chúng tôi đã gặp và xử lý. Phần lớn lỗ hổng thực tế không nằm ở core WordPress mà ở plugin và theme — đúng như OWASP Top 10 liên tục cảnh báo về thành phần bên thứ ba dễ tổn thương.

1. File Permissions

Sai file permissions là nguyên nhân phổ biến nhất khiến mã độc có thể ghi file lên server. Chuẩn cho WordPress:

  • Thư mục: 755 (owner đọc/ghi/execute, group và others chỉ đọc/execute)
  • Files: 644 (owner đọc/ghi, group và others chỉ đọc)
  • wp-config.php: 600 hoặc 640 — file này chứa database credentials, không ai ngoài owner cần đọc

Nhiều hosting shared đặt permissions là 777 cho thư mục uploads — bất kỳ ai trên server đều có thể ghi file vào đó. Đây là mời hacker vào nhà.

# Fix permissions cho toàn bộ WordPress
find /path/to/wordpress -type d -exec chmod 755 {} \;
find /path/to/wordpress -type f -exec chmod 644 {} \;
chmod 600 /path/to/wordpress/wp-config.php

2. Bảo vệ đăng nhập

Brute force là phương thức tấn công đơn giản nhất — bot thử hàng ngàn tổ hợp username/password. Biện pháp:

  • Giới hạn số lần đăng nhập sai. Plugin Limit Login Attempts Reloaded — miễn phí, hiệu quả. Sau 3 lần sai, khóa IP 15 phút. Sau 3 lần bị khóa, khóa 24 giờ.
  • Không dùng username "admin". Bot luôn thử "admin" đầu tiên. Tạo username khó đoán.
  • Đổi URL đăng nhập. Mặc định là /wp-login.php/wp-admin/. Đổi sang URL tùy chỉnh. Không phải bảo mật tuyệt đối — nhưng loại bỏ 90% bot.
  • Two-factor authentication. Cho admin accounts, 2FA nên là bắt buộc. Plugin WP 2FA hoạt động tốt.

3. Khóa XML-RPC

XML-RPC (/xmlrpc.php) là API cũ của WordPress — cho phép đăng bài từ ứng dụng bên ngoài. Hầu hết website không cần, nhưng nó vẫn mở mặc định. Vấn đề: XML-RPC cho phép thử nhiều password trong một request (system.multicall) — bypass giới hạn đăng nhập.

# Trong .htaccess (Apache)
<Files xmlrpc.php>
  Require all denied
</Files>

Hoặc trong Nginx:

location = /xmlrpc.php {
  deny all;
  return 403;
}

Nếu bạn cần XML-RPC (ví dụ cho Jetpack), whitelist IP cụ thể thay vì mở cho toàn bộ.

4. HTTP Security Headers

Headers không ngăn được mã độc trên server — nhưng bảo vệ người dùng khỏi các cuộc tấn công phía client (XSS, clickjacking, MIME sniffing):

# Thêm vào .htaccess hoặc nginx config
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()

Content-Security-Policy (CSP) hiệu quả nhất nhưng cũng phức tạp nhất — dễ gây lỗi nếu thiết lập sai. Chúng tôi thêm CSP từ từ, test kỹ trước khi enforce.

5. Vô hiệu hóa chỉnh sửa file trong admin

WordPress mặc định cho phép chỉnh sửa plugin và theme files từ admin panel. Nếu tài khoản admin bị compromised, hacker có thể chèn mã độc trực tiếp từ giao diện web.

// Thêm vào wp-config.php
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true); // Cả install/update plugin từ admin

DISALLOW_FILE_MODS cũng tắt update plugin/theme từ admin — bạn sẽ cần update qua WP-CLI hoặc SFTP. Đây là trade-off an toàn: bất tiện hơn, nhưng bảo mật hơn đáng kể.

6. Database security

  • Đổi prefix bảng. Mặc định là wp_. Đổi sang prefix ngẫu nhiên khiến SQL injection attacks khó hơn (không bất khả thi, nhưng thêm một lớp).
  • Database user riêng cho WordPress. Không dùng root. User chỉ có quyền SELECT, INSERT, UPDATE, DELETE trên database WordPress — không có DROP, ALTER, GRANT.
  • Xóa bảng không dùng. Plugin cũ có thể để lại bảng không còn sử dụng trong database. Nên dọn dẹp định kỳ.

7. Plugin và theme hygiene

Plugin và theme lỗi thời là vector tấn công phổ biến nhất. Quy tắc:

  • Xóa plugin không dùng — không chỉ deactivate. Plugin inactive vẫn có thể bị khai thác nếu có lỗ hổng.
  • Xóa theme mặc định không dùng. Giữ lại theme đang dùng + một theme mặc định (Twenty Twenty-Four) cho fallback.
  • Không dùng plugin nulled/cracked. 100% chứa mã độc. Không có ngoại lệ.
  • Kiểm tra plugin trước khi cài. Xem lần update cuối, số lượng active installs, rating. Plugin không được update >1 năm = rủi ro.
  • Auto-update cho minor versions. WordPress minor updates (5.9.1 → 5.9.2) chủ yếu là security patches. Nên bật auto-update.

8. Backup — lớp phòng thủ cuối cùng

Mọi biện pháp bảo mật đều có thể bị vượt qua. Backup là thứ duy nhất cho phép bạn phục hồi khi mọi thứ khác thất bại.

  • Backup hàng ngày — cả files và database
  • Lưu trữ offsite — không chỉ trên cùng server. Nếu server bị compromise, backup trên server cũng bị.
  • Giữ 30 ngày — đôi khi malware chỉ được phát hiện sau vài tuần. Cần backup sạch từ trước khi bị nhiễm.
  • Test restore — backup vô nghĩa nếu không restore được. Test ít nhất mỗi quý.

Backup chỉ hữu ích khi bạn biết site gặp sự cố sớm. Một hệ thống giám sát uptime như mô tả trong bài viết về Uptime Kuma sẽ cảnh báo ngay khi site sập hoặc redirect bất thường — dấu hiệu sớm của một vụ hack.

9. Tối ưu tốc độ — bảo mật gián tiếp

Website chậm thường là dấu hiệu của vấn đề bảo mật — mã độc chèn code, database queries bất thường, hoặc đơn giản là hosting yếu khiến không thể chạy security plugins.

  • Page caching — giảm tải PHP processing. WP Super Cache hoặc W3 Total Cache.
  • Object caching — Redis hoặc Memcached cho database query cache.
  • CDNCloudflare miễn phí, giảm tải server và thêm WAF cơ bản. SSL miễn phí qua Let's Encrypt nên là mặc định cho mọi site.
  • Image optimization — ảnh chưa nén chiếm 50-80% page weight. WebP conversion + lazy loading. Nếu cần nén/đổi định dạng ảnh nhanh, công cụ Craft của ERPFit xử lý được hàng loạt.
  • PHP version — PHP 8.2+ nhanh hơn đáng kể so với 7.4. Upgrade PHP là cách tối ưu nhanh nhất.

Khi website đã bị hack

Nếu website đã bị nhiễm mã độc, checklist trên không đủ. Quy trình xử lý:

  1. Cách ly — đưa website offline hoặc vào maintenance mode ngay. Ngăn malware lây lan và bảo vệ người dùng.
  2. Quét toàn bộ filesystem — tìm files bất thường, files mới tạo gần đây, code obfuscated. wp-cli có lệnh wp core verify-checksums so sánh core files với bản gốc.
  3. Cài lại WordPress corewp core download --force. Giữ nguyên wp-content/ và database.
  4. Kiểm tra từng plugin và theme — so sánh với bản gốc từ WordPress.org. Bất kỳ file nào bị modified = nghi ngờ.
  5. Kiểm tra database — tìm JavaScript/iframe injection trong posts, options, user metadata.
  6. Đổi tất cả credentials — admin passwords, database password, SFTP, hosting panel.
  7. Áp dụng checklist bảo mật — tất cả các mục ở trên.
  8. Submit lại Google Search Console — yêu cầu gỡ cảnh báo "This site may be hacked".

Toàn bộ quy trình mất 2-4 giờ cho website đơn giản, 1-2 ngày cho website phức tạp. Nhưng quan trọng hơn là ngăn tái nhiễm — đó là lý do checklist bảo mật phải được áp dụng ngay sau khi dọn dẹp.

Kết luận

Bảo mật WordPress không khó — nhưng cần kỷ luật. Hầu hết website bị hack không phải vì hacker giỏi, mà vì chủ website quên update plugin, dùng password yếu, hoặc cài theme cracked.

Checklist này không phải bất khả xâm phạm. Nhưng nó loại bỏ đại đa số vector tấn công phổ biến — và đó là sự khác biệt giữa website an toàn và website sẽ bị hack trong 6 tháng tới. Nếu bạn muốn xây dựng cả hạ tầng từ đầu, xem thêm stack mã nguồn mở chúng tôi dùng cho khách hàng.

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

Làm sao biết WordPress bị hack?
Dấu hiệu phổ biến: redirect sang trang lạ, cảnh báo "This site may be hacked" trên Google, file mới lạ trong thư mục, hoặc admin không đăng nhập được. Chạy wp core verify-checksums để so sánh core với bản gốc từ WordPress.org, và quét bằng plugin như Wordfence.
XML-RPC có an toàn không?
XML-RPC (/xmlrpc.php) mở mặc định và là vector brute-force phổ biến vì cho phép thử nhiều password trong một request. Hầu hết website không cần nó. Nếu không dùng Jetpack hay app đăng bài bên ngoài, hãy chặn hoàn toàn qua .htaccess hoặc Nginx như hướng dẫn ở trên.
Plugin bảo mật nào cần thiết cho WordPress?
Tối thiểu nên có: một plugin giới hạn đăng nhập (Limit Login Attempts Reloaded), 2FA (WP 2FA), và một plugin quét malware (Wordfence hoặc Sucuri). Tránh cài quá nhiều plugin bảo mật chồng chéo — chúng gây xung đột và làm chậm site nhiều hơn là bảo vệ.
Có nên bật auto-update cho WordPress không?
Nên bật auto-update cho minor versions và security patches của core, vì đây chủ yếu là vá lỗ hổng. Với major versions và plugin quan trọng, hãy test trên staging trước. Kết hợp backup hàng ngày và giám sát uptime để phát hiện ngay nếu update gây lỗi.
Đổi prefix bảng database có thực sự chống được hack?
Đổi prefix từ wp_ sang chuỗi ngẫu nhiên không phải bảo mật tuyệt đối — nó chỉ làm SQL injection theo kịch bản tự động khó hơn một chút. Đây là lớp phòng thủ bổ sung, không thay thế cho việc cập nhật plugin, dùng database user hạn chế quyền, và backup đầy đủ.
LN
Long Nguyen
CTO, ERPFit

CTO của ERPFit. Trực tiếp xây dựng và vận hành hạ tầng kỹ thuật, bộ công cụ Craft và nền tảng dịch vụ cho doanh nghiệp Việt Nam.

Chia sẻ:𝕏FBin