Khoá trang đăng nhập WordPress cần sáu lớp, không phải một plugin: mật khẩu dài kèm 2FA, giới hạn lần thử, chặn xmlrpc, giấu tên đăng nhập, chặn ở máy chủ và đổi đường dẫn. Với giới hạn 5 lần mỗi 20 phút, một IP dò 10.000 mật khẩu mất khoảng 27,8 ngày. Nhưng 1.000 IP chạy song song chỉ cần 40 phút (số giả định minh hoạ, tính ở dưới).
Dò mật khẩu là hàng trăm lần đăng nhập sai dồn vào cùng một form
Tấn công dò mật khẩu không cần thông minh. Máy thử lần lượt danh sách mật khẩu phổ biến vào wp-login.php cho tới khi một cặp tên đăng nhập và mật khẩu trúng. Bạn thấy nó trong nhật ký truy cập máy chủ: nhiều yêu cầu POST tới trang đăng nhập, cách nhau vài giây hoặc ít hơn.
Ba dòng dưới đây do chúng tôi tự dựng để minh hoạ, không phải nhật ký của khách. Địa chỉ IP thuộc dải dành cho tài liệu mẫu.
203.0.113.15 - - [15/Oct/2026:02:14:07 +0700] "POST /wp-login.php HTTP/1.1" 200 4521
203.0.113.15 - - [15/Oct/2026:02:14:07 +0700] "POST /wp-login.php HTTP/1.1" 200 4521
198.51.100.42 - - [15/Oct/2026:02:14:08 +0700] "POST /wp-login.php HTTP/1.1" 200 4521
Dấu hiệu cần để ý là cùng một đường dẫn, lặp liên tục, từ một hoặc nhiều IP. Nhiều IP khác nhau cùng thử là kiểu phổ biến hơn, vì bot tấn công thường chạy theo mạng máy bị chiếm. Chặn từng IP một vì vậy chỉ là việc đuổi theo.
Sáu lớp khoá, xếp theo việc nên làm trước
Không lớp nào chặn được mọi thứ. Mỗi lớp bịt một cửa và có một chỗ hỏng riêng, nên chúng tôi xếp theo thứ tự: làm trước lớp rẻ mà chặn nhiều, làm sau lớp cần đụng vào máy chủ.
| # | Lớp | Chặn được gì | Hỏng khi nào | Làm mất (ước tính) |
|---|---|---|---|---|
| 1 | Mật khẩu dài + 2FA / passkey | Đoán mật khẩu; mật khẩu lộ từ nơi khác vẫn không đủ để vào | Mật khẩu dùng lại ở nhiều nơi; tài khoản không bật 2FA | 30 phút |
| 2 | Giới hạn lần thử | Một IP thử liên tục | Kẻ tấn công đổi IP; khoá nhầm người thật | 15 phút |
| 3 | Chặn xmlrpc.php | Thử nhiều mật khẩu trong một yêu cầu | Ứng dụng hoặc plugin còn dùng xmlrpc | 10 phút |
| 4 | Không lộ tên đăng nhập | Kẻ tấn công biết trước tên cần dò | REST hoặc ?author=1 còn trả tên đăng nhập | 15 phút |
| 5 | Chặn ở máy chủ / WAF | Yêu cầu xấu bị cắt trước khi WordPress chạy | Cấu hình sai (trắng trang) hoặc khoá cả IP thật | 1–2 giờ |
| 6 | Đổi đường dẫn đăng nhập | Bot chỉ thử đường dẫn mặc định | Chỉ giảm tiếng ồn; bị lộ là hết tác dụng | 15 phút |
Thời gian là ước tính của chúng tôi cho một site đơn lẻ, không phải số đo. Danh sách lớp đối chiếu hướng dẫn của WordPress.org, đọc 15/10/2026.
Hướng dẫn của WordPress.org cũng đi theo hướng này: mật khẩu mạnh, 2FA hoặc passkey, giới hạn tốc độ, CAPTCHA và bảo vệ XML-RPC.

Lớp 1 là lớp đầu tiên cần làm. Nếu chưa đổi mật khẩu quản trị, xem hướng dẫn đổi mật khẩu quản trị website rồi bật 2FA cho mọi tài khoản có quyền quản trị.
Giới hạn lần thử chỉ làm chậm, không chặn khi đứng một mình
Giới hạn lần thử làm kẻ tấn công chậm đi rất nhiều, nhưng nó tính theo IP. Khi kẻ tấn công có nhiều IP, giới hạn gần như mất tác dụng. Số dưới đây là ví dụ tính với giả định minh hoạ, không phải số đo thực tế.
mat_khau = 10_000 # số mật khẩu phổ biến cần thử
# 1) Không giới hạn, 10 lần/giây từ một IP
print(mat_khau / 10 / 60) # 16.7 phút
# 2) Giới hạn: sai 5 lần thì khoá 20 phút, một IP
dot = mat_khau // 5 # 2000 đợt
print(dot * 20 / 60 / 24) # 27.8 ngày
# 3) Cùng giới hạn, 1.000 IP chạy song song
print(dot * 20 / 1000) # 40.0 phút
| Tình huống | Thời gian dò 10.000 mật khẩu |
|---|---|
| Không giới hạn, 10 lần/giây, 1 IP | 16,7 phút |
| Khoá 20 phút sau 5 lần sai, 1 IP | 27,8 ngày |
| Cùng giới hạn, 1.000 IP song song | 40 phút |
Giả định minh hoạ của Net Solutions: 10.000 mật khẩu, 10 lần/giây, khoá 20 phút. Không phải số đo trên site thật.
Con số 5 lần mỗi 20 phút chỉ là ví dụ để tính, không phải khuyến nghị cứng. Điều cần nhớ là giới hạn mua thời gian cho bạn, còn lớp 1 mới là thứ làm mật khẩu bị lộ trở nên vô dụng.
XML-RPC là cửa phụ cho phép thử hàng trăm mật khẩu trong một lần gọi
xmlrpc.php cho phép gom nhiều lệnh vào một yêu cầu bằng system.multicall. Với giới hạn tính theo số lần đăng nhập thất bại ở form, kẻ tấn công có thể thử nhiều mật khẩu mà chỉ tốn vài yêu cầu.
Imagine a request that was able to try 500 passwords in one shot.
— Sucuri, Brute Force Amplification Attacks Against WordPress XML-RPC, 10/2015
Sucuri dùng 500 mật khẩu một yêu cầu làm ví dụ, và chúng tôi dùng đúng con số đó để tính: 10.000 mật khẩu chỉ cần 20 yêu cầu. Đó là giả định minh hoạ, không phải số đo.
Nếu site không dùng ứng dụng hay plugin nào gọi xmlrpc thì nên chặn hẳn. Một số ứng dụng cũ hoặc plugin như Jetpack bản cũ vẫn dựa vào cửa này, nên hãy kiểm trước rồi mới chặn. Kiểm bằng lệnh curl -I ở mục kiểm bên dưới.
Đổi đường dẫn đăng nhập chỉ giảm tiếng ồn, và có một bẫy đăng xuất im lặng
Tip: Obscuring the login URL can reduce noise but should not be your only defense. (dịch: Giấu đường dẫn đăng nhập có thể giảm tiếng ồn nhưng không nên là biện pháp phòng thủ duy nhất.)
— WordPress.org, Brute Force Attacks, đọc 15/10/2026
Trên hạ tầng chúng tôi quản lý (đo 22/09/2026), /wp-login.php trả 403 ở tầng máy chủ, trang đăng nhập đã đổi đường dẫn và xmlrpc.php cũng trả 403. Chúng tôi coi đây là ba lớp chồng nhau, không lớp nào đứng một mình.
Đổi đường dẫn có một bẫy thật. Hàm wp_logout_url() của WordPress vẫn sinh liên kết trỏ tới wp-login.php. Khi đường dẫn đó trả 403, bấm Đăng xuất sẽ không báo lỗi gì, nhưng phiên vẫn chưa bị huỷ. Chúng tôi gặp lỗi này khi viết công cụ đăng nhập tự động.
Tên đăng nhập có đang lộ không
Dò mật khẩu cần có tên đăng nhập trước. Vì vậy lớp 4 là bịt các nơi WordPress tự khai tên đăng nhập. Ba nơi cần kiểm: đường REST /wp-json/wp/v2/users, kiểu dò ?author=1, và chính tên admin mặc định.
Trong một ca chúng tôi xử lý hồi tháng 9/2026, đường REST từng trả cả user_login. Sau khi bịt, nó chỉ còn trả slug và tên hiển thị. Nếu tên hiển thị trùng tên đăng nhập thì vẫn lộ như cũ, nên hãy đặt hai thứ khác nhau và đừng dùng admin.
Năm phép thử để biết đã khoá thật
Cài xong chưa có nghĩa là chặn được. Năm phép thử dưới đây đều làm được trong vài phút, và mỗi phép có kết quả đúng rõ ràng.
| Phép thử | Cách làm | Kết quả đúng |
|---|---|---|
| 1. Sai quá ngưỡng | Đăng nhập sai quá số lần cho phép bằng một tài khoản thử, không dùng tài khoản quản trị chính | Có thông báo khoá; chờ hết thời gian khoá mới vào lại được |
| 2. Cửa xmlrpc | Chạy lệnh curl -I tới xmlrpc.php (bên dưới) | 403 hoặc 404. Trả 200, hoặc 405 kèm dòng “XML-RPC server accepts POST requests only”, nghĩa là cửa còn mở |
| 3. Đăng xuất | Đăng nhập, bấm Đăng xuất, mở lại trang quản trị trong cùng trình duyệt | Bị đưa về trang đăng nhập; cookie phiên đăng nhập biến mất |
| 4. Số quản trị viên | Vào Người dùng, lọc vai trò Quản trị viên, đối chiếu với danh sách người thật | Chỉ có tên bạn biết và còn đang làm việc |
| 5. Ngày sửa lạ | Xem ngày sửa cuối của bài và trang; so với ngày đăng | Không có bài nào sửa vào ngày bạn không làm; ngày đăng có thể bị kẻ tấn công ghi lùi, nên đối chiếu cả hai |
Cách kiểm do Net Solutions tổng hợp từ quy trình rà bảo mật nội bộ.
Ba lệnh dưới đây kiểm phép 2 và hai nơi có thể lộ tên đăng nhập. Bạn thay ten-mien-cua-ban.vn bằng tên miền của mình:
# Cửa xmlrpc: 403 hoặc 404 là đã đóng
curl -I https://ten-mien-cua-ban.vn/xmlrpc.php
# Danh sách người dùng qua REST: nên là 401/403, hoặc không có user_login
curl -s https://ten-mien-cua-ban.vn/wp-json/wp/v2/users
# Dò tên đăng nhập bằng ?author=1: không nên chuyển hướng sang /author/<tên đăng nhập>/
curl -sI "https://ten-mien-cua-ban.vn/?author=1"
Khoá đăng nhập chưa đủ: ca 20 ngày, 47 quản trị viên giả
Một site chúng tôi tiếp nhận từng bị chiếm 20 ngày với 47 quản trị viên giả. Không ai dò mật khẩu. Các tài khoản đó được tạo qua một cửa REST đang mở, không cần mật khẩu, và cũng không có tệp lạ nào để quét ra.
Ca này đã được công khai, ẩn danh, trong bài WordPress bị chèn mã độc, cách xử lý. Bài học: khoá trang đăng nhập chỉ chặn một con đường vào. Bạn vẫn cần cập nhật lõi và plugin, đóng cửa REST tạo người dùng, và canh số quản trị viên (phép thử 4 ở trên).
Khi nào bạn không cần làm hết sáu lớp
Net Solutions không bán plugin chống dò mật khẩu. Với site nhỏ, 2FA cộng giới hạn lần thử đã đủ cho phần lớn nhu cầu. Ba lớp còn lại tính khi bạn quản nhiều người dùng hoặc đã từng bị tấn công.
Một lưu ý quan trọng: nếu không quen máy chủ, đừng tự sửa .htaccess hay cấu hình nginx. Sai một ký tự là trắng cả trang. Khi cần, hãy nhờ người rành, hoặc xem bảo trì website gồm những việc gì và dịch vụ chăm sóc website của chúng tôi.
Câu hỏi thường gặp
Dò mật khẩu WordPress là gì, nhận ra bằng dấu hiệu nào? Đó là việc máy thử hàng loạt mật khẩu vào trang đăng nhập cho tới khi trúng. Dấu hiệu là nhiều yêu cầu POST tới wp-login.php hoặc xmlrpc.php trong nhật ký truy cập, cùng một đường dẫn, lặp liên tục từ một hay nhiều IP. Site cũng có thể chậm lại, và hộp thư nhận nhiều thông báo đăng nhập thất bại.
Giới hạn số lần đăng nhập mấy lần là hợp lý? Không có con số duy nhất đúng. Bài này lấy 5 lần rồi khoá 20 phút làm ví dụ tính. Quan trọng hơn là nhớ giới hạn theo IP chỉ làm chậm. Hãy đặt ngưỡng đủ chặt để chặn bot nhưng đủ rộng để người gõ nhầm vài lần không bị khoá ngay.
Đổi đường dẫn wp-login có đủ an toàn không? Không. WordPress.org mô tả việc này là giảm tiếng ồn, không nên là biện pháp duy nhất. Đường dẫn mới có thể bị lộ qua liên kết đăng xuất, email hay plugin. Hãy coi đây là lớp phụ, đặt sau mật khẩu mạnh, 2FA và giới hạn lần thử.
Có nên tắt xmlrpc.php không? Nên tắt nếu không có ứng dụng hay plugin nào cần. Cửa này cho phép thử nhiều mật khẩu trong một yêu cầu. Nếu còn dùng Jetpack bản cũ hay một ứng dụng đăng bài từ xa, hãy kiểm trước khi chặn, vì chặn nhầm sẽ làm chúng ngừng hoạt động.
Bị khoá nhầm IP của chính mình thì vào lại thế nào? Chờ hết thời gian khoá thường là cách an toàn nhất. Nếu cần vào gấp, dùng kết nối khác như điện thoại 4G, hoặc nhờ người có quyền máy chủ gỡ IP khỏi danh sách chặn. Vì vậy hãy chuẩn bị sẵn một lối vào riêng trước khi bật giới hạn.
Bật 2FA có làm nhân viên khó đăng nhập không? Có thêm một bước, nhưng chỉ vài giây mỗi lần đăng nhập. Hãy bật cho mọi tài khoản có quyền quản trị trước, người chỉ viết bài làm sau. Lưu mã dự phòng ở nơi an toàn để không mất quyền khi đổi điện thoại.
Đã khoá đăng nhập mà vẫn bị chiếm site thì do đâu? Thường do một con đường khác không đi qua form đăng nhập: lõi hoặc plugin lỗi thời, cửa REST tạo người dùng đang mở, hoặc mật khẩu máy chủ bị lộ. Ca 47 quản trị viên giả ở trên là ví dụ. Hãy kiểm số quản trị viên, ngày sửa cuối của bài và cập nhật lõi cùng plugin.
Cần người kiểm và khoá trang đăng nhập giúp bạn?
Net Solutions rà từng lớp ở trên trên site của bạn và báo cáo lớp nào còn hở, lớp nào cần sửa trước.
Xem dịch vụ chăm sóc websiteNhắn ZaloHotline 0906.207.001
Cập nhật 17/10/2026 bởi Công ty TNHH Net Solutions.