WordPress REST API: vì sao chỉ chặn khi chưa đăng nhập thay vì tắt hẳn

Thông báo tiếp thị liên kết Ver 3.1
Thông báo tiếp thị liên kết Ver 3.2 (chỉ trên di động)

WordPress REST API để lộ tên người dùng của website qua địa chỉ wp-json, kể cả với khách chưa đăng nhập. Tắt hẳn có khi làm trình soạn thảo khối lưu thất bại, nên bài viết tóm tắt cách chỉ chặn yêu cầu khi chưa đăng nhập và kiểm tra bằng phản hồi 401.

1️⃣ WordPress REST API là gì: địa chỉ wp-json và việc nó làm

WordPress REST API là tính năng có sẵn của WordPress để trao đổi dữ liệu website như bài viết, trang, người dùng ở định dạng JSON, và phản hồi dưới /wp-json/ sau địa chỉ website.

Dưới /wp-json/, địa chỉ được chia theo loại dữ liệu như [wp/v2/posts]·[wp/v2/pages]·[wp/v2/users], và mỗi địa chỉ này gọi là endpoint. Trình soạn thảo khối cũng gửi yêu cầu đến địa chỉ này khi lưu bài.

https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users

2️⃣ Tên người dùng lộ qua wp-json

  • ↪️ Lý do chặn: users 401 · cũng thấy ở trang tác giả

Endpoint [wp/v2/users] trả về tên hiển thị và giá trị slug của từng người dùng đã đăng bài, và mặc định slug chứa nguyên ID đăng nhập. Tài khoản quản trị của site thử nghiệm https://testpilotweb.com/ cũng có slug giống ID đăng nhập.

Khi ID đăng nhập bị lộ, kẻ tấn công chỉ cần dò ra mật khẩu là đăng nhập được, và màn hình đăng nhập WordPress của site thử nghiệm đã ghi nhận 2.570 lần dò mật khẩu chỉ trong ngày 7/10/2026.

Dù chặn địa chỉ này, cùng ID vẫn còn trong địa chỉ trang tác giả (/author/ID/).

3️⃣ Những gì hỏng khi tắt hẳn

  • ↪️ Lưu trong trình soạn thảo khối · 0 công cụ MCP

Nếu tắt toàn bộ WP REST API, việc lưu bài trong trình soạn thảo khối sẽ hỏng trước tiên; vì vậy Perfmatters, một plugin tối ưu WordPress, chia phạm vi tắt thành hai mức [Disable for Non-Admins] và [Disable When Logged Out]. Với site có tài khoản tác giả hoặc cộng tác viên, [Disable for Non-Admins] cũng chặn các tài khoản đó lưu bài.

Ngay cả trên site chỉ chặn khi chưa đăng nhập, khi kết nối MCP connector trong claude.ai, sau khi xác thực xong số công cụ hiện là 0. Log server ghi mọi yêu cầu MCP là 401, và nguyên nhân là Perfmatters chặn yêu cầu trước khi MCP kiểm tra token.

Giá trị [Disable REST API]Địa chỉ users với khách chưa đăng nhậpLưu bài của tài khoản không phải quản trị viênPhù hợp với
Default (Enabled)Lộ tên người dùngLưu được—
Disable for Non-Admins401Lưu thất bạiSite không có tài khoản tác giả·cộng tác viên
Disable When Logged Out401Lưu đượcSite có tài khoản tác giả; kết nối bằng token như MCP thì thêm đường dẫn ngoại lệ

4️⃣ Cài đặt chỉ chặn khi chưa đăng nhập (Perfmatters)

  • ↪️ Vị trí cài đặt · kiểm tra phản hồi 401

Trong màn hình quản trị WordPress, vào [Cài đặt] → [Perfmatters] → [General], đổi [Disable REST API] ở mục [Core] thành [Disable When Logged Out] rồi bấm [Lưu thay đổi].

WordPress Settings → Perfmatters → General (WordPress REST API)
Perfmatters Disable REST API: Disable When Logged Out

Ngôn ngữ Perfmatters hỗ trợ: tiếng Anh (mặc định), tiếng Hàn, tiếng Đức, tiếng Pháp, tiếng Ý, tiếng Hà Lan, tiếng Bồ Đào Nha (Brazil), tiếng Nga, tiếng Ukraina, tiếng Thổ Nhĩ Kỳ, tiếng Bulgaria, tiếng Hungary, tiếng Indonesia, tiếng Ba Tư, tiếng Trung (giản thể)

Perfmatters settings simulator: General → Core
Trình mô phỏng cài đặt Perfmatters · Đánh giá·hướng dẫn Perfmatters

Mở /wp-json/wp/v2/users trong cửa sổ ẩn danh mà không đăng nhập sẽ nhận phản hồi 401 kèm thông báo [Sorry, you do not have permission to make REST API requests.], còn trình soạn thảo khối khi đã đăng nhập vẫn lưu bài bình thường.

🔌 Cùng yêu cầu, hai phản hồi GET /wp-json/wp/v2/users
Site không chặn
200
Khách chưa đăng nhập cũng xem được tên người dùng.
[
  {
    "id": 1,
    "name": "User A",
    "slug": "user_a",
    "link": "https://example.com/author/user_a/"
  }
]
Site bật [Disable When Logged Out]
401
Yêu cầu chưa đăng nhập nhận phản hồi 401 kèm thông báo.
{⏎  "code": "rest_authentication_error",⏎  "message": "Sorry, you do not have permission to make REST API requests.",⏎  "data": { "status": 401 }⏎}
slug Mặc định slug chứa nguyên ID đăng nhập.
Bên trái chỉ lấy bốn mục từ phản hồi là id·name·slug·link, và tên là ví dụ (user_a).


5️⃣ Thêm ngoại lệ cho đường dẫn đã chặn

  • ↪️ Ngoại lệ đường dẫn MCP · khác với gỡ liên kết REST API

Khi cần mở riêng một đường dẫn trong lúc đang chặn, hãy thêm đường dẫn đó vào filter [perfmatters_rest_api_exceptions] của Perfmatters. Lỗi 0 công cụ của MCP connector trên claude.ai được giải quyết bằng cách tạo snippet PHP trong menu [Code] của Perfmatters, chỉ để đường dẫn MCP làm ngoại lệ.

add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
    $exceptions[] = '/mcp/mcp-oauth-server';
    return $exceptions;
});

Ngay cả sau khi thêm ngoại lệ, yêu cầu không có token vẫn bị chính MCP chặn với thông báo [MCP authentication required.] và phản hồi 401, còn /wp-json/wp/v2/users vẫn tiếp tục trả về phản hồi 401 của Perfmatters.

🚦 Thứ tự yêu cầu đi qua
Trước khi thêm ngoại lệ · yêu cầu MCP
Yêu cầu do MCP connector của claude.ai gửi sau khi xác thực xong, ở trạng thái [Disable When Logged Out].
Perfmatters
Chặn 401
→↓
Kiểm tra token MCP
Không tới được
→↓
Kết quả
0 công cụ
Sau khi thêm ngoại lệ · yêu cầu MCP
/mcp/mcp-oauth-server Đã thêm đường dẫn vào ngoại lệ của Perfmatters.
Perfmatters
Đi qua vì là đường dẫn ngoại lệ
→↓
Kiểm tra token MCP
MCP tự kiểm tra
→↓
Kết quả
Không có token thì 401
[MCP authentication required.]
Sau khi thêm ngoại lệ · /wp-json/wp/v2/users
Đường dẫn không đưa vào ngoại lệ vẫn bị chặn.
Perfmatters
Chặn 401
→↓
Kết quả
Vẫn chặn lộ tên người dùng
⚠️ Perfmatters chặn yêu cầu trước khi MCP kiểm tra token.

[Remove REST API Links] trong cùng mục [Core] chỉ xóa liên kết api.w.org khỏi phần đầu trang và header phản hồi; bản thân WP REST API vẫn phản hồi như cũ.

🔢 FAQ & nội dung đề xuất

xmlrpc.php là địa chỉ khác với REST API nên vẫn phản hồi dù đã chặn REST API. Site thử nghiệm ghi nhận 734 yêu cầu POST đến xmlrpc.php chỉ trong ngày 8/10/2026, và Perfmatters có thể chặn bằng [Disable XML-RPC] trong cùng mục [Core].

WP Rocket để địa chỉ /wp-json/ trong danh sách loại trừ cache, nên phản hồi REST API thay đổi ngay khi lưu. Các cài đặt làm thay đổi HTML của trang như [Remove REST API Links] chỉ có hiệu lực sau khi xóa cache.

Không. Trình soạn thảo khối của WordPress gửi yêu cầu đến REST API khi lưu bài, và MCP connector kết nối công cụ AI như claude.ai cũng dùng đường dẫn dưới /wp-json/.

ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 5   +   5   =