wp-config.php là file quan trọng nhất trong toàn bộ cài đặt WordPress. Nó chứa thông tin kết nối database, khóa bảo mật, và hàng loạt cấu hình ảnh hưởng trực tiếp đến bảo mật website. Thế nhưng phần lớn người dùng WordPress chưa bao giờ mở file này ra chỉnh sửa, để mặc cấu hình mặc định mà không biết rằng chỉ vài dòng cấu hình đúng có thể chặn được hầu hết các cuộc tấn công phổ biến.
Trong bài này mình sẽ hướng dẫn bạn từng bước bảo mật wp-config.php. Mình sẽ đi qua 12 cấu hình quan trọng nhất, giải thích rõ tại sao phải làm thế, và cung cấp code cụ thể để bạn copy-paste luôn. Nếu bạn chưa từng sửa file wp-config.php bao giờ, đừng lo — mình viết bài này đúng theo cách mà mình mong người khác đã viết cho mình ngày xưa.
wp-config.php Là Gì và Tại Sao Phải Bảo Mật Nó?
wp-config.php là file cấu hình chính của WordPress, nằm ở thư mục gốc (root) của website. File này chứa 4 thông tin nhạy cảm nhất: tên database, username, password database, và database host. Ngoài ra nó còn chứa security keys và các hằng số (constants) điều khiển hành vi bảo mật của toàn bộ site.
Bất kỳ ai truy cập được file này đều có thể đọc thông tin kết nối database, từ đó chiếm toàn bộ kiểm soát website. Đó là lý do bảo mật wp-config.php phải là ưu tiên hàng đầu, trước cả cài plugin hay cấu hình firewall.
Di Chuyển wp-config.php Ra Khỏi Thư Mục Công Khai (Bước 1 Quan Trọng Nhất)
Mặc định wp-config.php nằm ở thư mục gốc, nơi mà web server phục vụ file cho người dùng. WordPress cho phép bạn di chuyển file này lên một thư mục cao hơn (parent directory), nằm ngoài document root, khiến attacker không thể truy cập qua URL.
Bạn chỉ cần di chuyển file wp-config.php lên thư mục cha:
# SSH vào server, di chuyển file
mv /var/www/thienlv.com/public_html/wp-config.php /var/www/thienlv.com/wp-config.phpWordPress tự động tìm wp-config.php ở thư mục cha nếu không tìm thấy ở thư mục gốc. Bạn không cần sửa bất kỳ dòng code nào. Lưu ý: một số hosting shared không cho phép truy cập ngoài public_html, nên nếu gặp lỗi thì bạn có thể bỏ qua bước này và tập trung vào các bước bên dưới.
Thiết Lập Quyền Truy Cập File Đúng Cách
Sau khi di chuyển hoặc bảo mật file, bạn cần đảm bảo quyền truy cập (file permissions) đúng. wp-config.php chỉ cần đọc được bởi web server, không cần ghi. Thiết lập như sau:
# Đặt quyền 440 (chỉ đọc, ngay cả owner cũng không ghi được)
chmod 440 /var/www/thienlv.com/wp-config.php
# Đảm bảo owner là www-data (hoặc user web server của bạn)
chown www-data:www-data /var/www/thienlv.com/wp-config.phpLưu ý: đừng đặt quyền 777 hay 666. Nhiều hướng dẫn cũ trên mạng vẫn khuyến nghị sai. Quyền 440 là an toàn nhất: owner và group đọc được, người khác không có quyền gì.
Tái Tạo Security Keys và Salt
Security keys (AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY, NONCE_KEY) và salts là 8 hằng số dùng để mã hóa cookie và session. Nếu website từng bị hack hoặc bạn nghi ngờ lộ thông tin, bạn cần tái tạo toàn bộ keys này. Truy cập API salt của WordPress để lấy bộ keys mới.
Mỗi lần tải trang đó sẽ tạo ra bộ keys ngẫu nhiên khác nhau. Copy toàn bộ 8 dòng và thay thế phần tương ứng trong wp-config.php:
define( 'AUTH_KEY', 'nội dung ngẫu nhiên mới' );
define( 'SECURE_AUTH_KEY', 'nội dung ngẫu nhiên mới' );
define( 'LOGGED_IN_KEY', 'nội dung ngẫu nhiên mới' );
define( 'NONCE_KEY', 'nội dung ngẫu nhiên mới' );
define( 'AUTH_SALT', 'nội dung ngẫu nhiên mới' );
define( 'SECURE_AUTH_SALT', 'nội dung ngẫu nhiên mới' );
define( 'LOGGED_IN_SALT', 'nội dung ngẫu nhiên mới' );
define( 'NONCE_SALT', 'nội dung ngẫu nhiên mới' );Khi bạn thay keys mới, tất cả user đang đăng nhập sẽ bị đăng xuất ngay lập tức. Đây là cách hiệu quả để “đuổi” attacker nếu họ đang có session hợp lệ.
Chặn Chỉnh Sửa File Từ Admin Dashboard
WordPress mặc định cho phép admin chỉnh sửa file theme và plugin trực tiếp từ Dashboard (Appearance > Theme File Editor, Plugins > Plugin File Editor). Đây là tính năng tiện lợi nhưng cực kỳ nguy hiểm — nếu attacker chiếm được tài khoản admin, họ có thể chèn mã độc trực tiếp qua giao diện web mà không cần SSH.
Thêm dòng sau vào wp-config.php để tắt hoàn toàn:
define( 'DISALLOW_FILE_EDIT', true );Một dòng duy nhất, hiệu quả ngay lập tức. Menu Theme File Editor và Plugin File Editor sẽ biến mất khỏi Dashboard. Đây là cấu hình mình khuyến nghị cho mọi website WordPress, từ blog cá nhân đến doanh nghiệp.
Kiểm Soát Cài Đặt và Cập Nhật Plugin/Theme
Nếu bạn quản lý site cho khách hàng hoặc có nhiều user admin, bạn nên kiểm soát khả năng cài đặt plugin và theme mới. WordPress cung cấp hằng số để chặn hành động này:
define( 'DISALLOW_FILE_MODS', true );Khi bật cấu hình này, user không thể cài plugin/theme mới, không thể cập nhật plugin/theme, và cũng không thể chỉnh sửa file (tự động bao gồm DISALLOW_FILE_EDIT). Menu Plugins > Add New và Themes > Add New sẽ bị ẩn.
Lưu ý: bạn chỉ nên dùng cấu hình này khi đã hoàn thiện website và không cần cài thêm plugin thường xuyên. Mình thường dùng cho site production ổn định, còn site đang phát triển thì bỏ qua.
Thay Đổi Tiền Tố Bảng Database
Mặc định WordPress sử dụng tiền tố wp_ cho tất cả bảng database. Điều này khiến SQL injection tấn công dễ đoán tên bảng. Nếu bạn đang cài mới WordPress, hãy thay đổi tiền tố ngay trong quá trình cài đặt. Nếu website đã chạy rồi, bạn vẫn có thể đổi nhưng cần cẩn thận hơn.
Trong wp-config.php, tìm dòng:
$table_prefix = 'wp_';Đổi thành tiền tố ngẫu nhiên:
$table_prefix = 'xk9_mY7_';Quan trọng: nếu website đã có dữ liệu, bạn phải đổi tên tất cả bảng trong database cho khớp với tiền tố mới, và cập nhật bảng usermeta và options. Plugin Better WP Security hoặc iThemes Security có thể tự động hóa quá trình này.
Bật Bắt Buộc SSL Cho Admin và Login
Nếu website đã cài SSL (HTTPS), bạn nên buộc tất cả kết nối đến admin và trang đăng nhập dùng SSL. Điều này ngăn chặn tấn công man-in-the-middle đánh cắp thông tin đăng nhập qua mạng.
define( 'FORCE_SSL_ADMIN', true );Sau khi thêm dòng này, WordPress tự động redirect tất cả truy cập đến wp-admin và wp-login.php sang HTTPS. Đảm bảo SSL certificate hợp lệ trước khi bật, nếu không bạn sẽ bị khóa ngoài admin.
Giới Hạn Số Lần Sửa Bài (Post Revisions)
WordPress mặc định lưu mọi lần sửa đổi bài viết, không giới hạn số lượng. Trên site có nhiều bài dài và nhiều author, bảng wp_posts có thể phình to nhanh chóng, làm chậm database và tăng rủi ro lộ nội dung nháp.
# Giới hạn 5 lần sửa đổi mỗi bài
define( 'WP_POST_REVISIONS', 5 );
# Hoặc tắt hoàn toàn
define( 'WP_POST_REVISIONS', false );Mình thường đặt 3-5 revisions cho blog nội dung, và tắt hoàn toàn cho site landing page không cần lịch sử sửa đổi.
Tự Động Cập Nhật WordPress Core
Từ WordPress 3.7, minor updates (bảo mật) tự động cập nhật. Nhưng major updates thì vẫn cần bạn nhấn nút. Nếu bạn muốn tất cả cập nhật tự động, kể cả major version:
define( 'WP_AUTO_UPDATE_CORE', true );Nếu bạn chỉ muốn minor updates tự động (khuyến nghị cho đa số site):
define( 'WP_AUTO_UPDATE_CORE', 'minor' );Nếu bạn muốn kiểm soát hoàn toàn, tắt auto update:
define( 'WP_AUTO_UPDATE_CORE', false );Mình khuyến nghị để minor tự động, còn major thì test trên staging trước khi cập nhật. Đặc biệt với WordPress 7.0 trở lên, cần kiểm tra tương thích plugin kỹ càng.
Bật Cookie Bảo Mật HTTP Only
Bạn nên cấu hình WordPress chỉ dùng cookie bảo mật qua HTTPS và thiết lập HttpOnly để JavaScript không thể đọc cookie:
define( 'ADMIN_COOKIE_PATH', '/wp-admin' );
define( 'COOKIEPATH', '/' );
define( 'SITECOOKIEPATH', '/' );
define( 'COOKIEHASH', md5( 'https://yourdomain.com' ) );Ngoài ra, đảm bảo trong php.ini hoặc .htaccess có session.cookie_httponly = 1. Điều này giúp chặn tấn công XSS đánh cắp session cookie.
Tắt XML-RPC Nếu Không Cần
XML-RPC là giao thức cũ cho phép ứng dụng bên ngoài tương tác với WordPress. Nó thường bị lợi dụng cho brute force attack vì cho phép thử hàng trăm password trong một request duy nhất. Nếu bạn không dùng plugin Jetpack hay ứng dụng desktop/mobile nào kết nối qua XML-RPC, hãy tắt nó.
Thêm vào .htaccess (Apache):
# Chặn XML-RPC
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>Hoặc trong Nginx:
location = /xmlrpc.php {
deny all;
}Hoặc đơn giản hơn, thêm vào wp-config.php (phần cuối file, trước require_once):
add_filter( 'xmlrpc_enabled', '__return_false' );Lưu ý: cách add_filter trong wp-config.php hoạt động nhưng không phải best practice. Nếu bạn có file functions.php trong theme hoặc custom plugin, hãy đặt filter đó ở đó.
Tắt Hiển Thị Lỗi Debug Trên Giao Diện Công Khai
WordPress ở chế độ debug mặc định sẽ hiển thị lỗi PHP trực tiếp trên trang web. Thông tin lỗi có thể tiết lộ đường dẫn file, cấu trúc database, và các thông tin nhạy cảm khác cho attacker.
# Bật debug nhưng chỉ ghi log, không hiển thị
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );Như vậy lỗi vẫn được ghi vào file /wp-content/debug.log để bạn kiểm tra, nhưng không hiển thị trên trang web. Trên production site, bạn nên đặt WP_DEBUG thành false hoàn toàn khi không cần debug.
Bảo Vệ wp-config.php Bằng .htaccess (Chỉ Apache)
Nếu bạn dùng Apache, thêm quy tắc vào .htaccess để chặn truy cập trực tiếp đến wp-config.php:
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>Đoạn code này nằm trong .htaccess ở thư mục gốc, ngăn bất kỳ yêu cầu HTTP nào đến wp-config.php. Kể cả khi attacker biết file tồn tại, họ cũng không thể tải về qua trình duyệt.
Ngăn Chặn Liệt Kê Thư Mục (Directory Listing)
Directory listing cho phép ai đó xem toàn bộ cấu trúc file và thư mục trên website nếu không có file index. Điều này tiết lộ thông tin về plugin, theme, và cấu trúc thư mục mà attacker có thể lợi dụng.
Thêm vào .htaccess (Apache):
Options -IndexesHoặc trong Nginx config:
autoindex off;Một dòng duy nhất nhưng ngăn được rất nhiều rủi ro không cần thiết.
Tổng Hợp: File wp-config.php Hoàn Chỉnh
Dưới đây là tổng hợp tất cả cấu hình bảo mật mình đề xuất trong bài. Bạn copy phần phù hợp vào file wp-config.php của mình, đặt trước dòng /* That's all, stop editing! */:
// --- Bảo mật wp-config.php ---
// Tắt chỉnh sửa file từ Dashboard
define( 'DISALLOW_FILE_EDIT', true );
// Bắt buộc SSL cho admin
define( 'FORCE_SSL_ADMIN', true );
// Giới hạn revisions
define( 'WP_POST_REVISIONS', 5 );
// Tự động cập nhật minor
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
// Debug chỉ ghi log
define( 'WP_DEBUG', false );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );
// Tăng giới hạn memory cho PHP
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
// Tắt JSON REST API cho user không đăng nhập (tùy chọn)
// add_filter( 'rest_authentication_errors', function( $result ) {
// if ( ! is_user_logged_in() ) {
// return new WP_Error( 'rest_disabled', 'REST API disabled.', array( 'status' => 403 ) );
// }
// return $result;
// });
/* That's all, stop editing! Happy publishing. */Đây là cấu hình baseline mà mình áp dụng cho mọi website WordPress mới. Tùy nhu cầu cụ thể bạn có thể điều chỉnh thêm.
Các Lỗi Thường Gặp Khi Sửa wp-config.php
Mình đã giúp rất nhiều bạn sửa lỗi sau khi chỉnh wp-config.php sai. Đây là những lỗi phổ biến nhất và cách fix:
Lỗi “Error establishing a database connection”: Nguyên nhân thường thấy nhất là bạn vô tình sửa sai thông tin kết nối database (DB_NAME, DB_USER, DB_PASSWORD, DB_HOST). Kiểm tra lại kỹ từng dòng, đảm bảo không có khoảng trắng thừa ở đầu và cuối giá trị.
Trang trắng (white screen): Thường do dấu <?php ở đầu file bị xóa, hoặc có khoảng trắng/dòng trống trước dấu <?php. File wp-config.php phải bắt đầu bằng <?php ngay ở dòng đầu tiên, không có khoảng trắng.
Không thể đăng nhập sau khi đổi security keys: Đây là hành vi bình thường — tất cả session cũ bị vô hiệu. Bạn chỉ cần đăng nhập lại bằng username và password đúng.
Website chậm sau khi bật debug log: File debug.log có thể phình to rất nhanh. Hãy kiểm tra và xóa file định kỳ, hoặc tắt WP_DEBUG khi không cần.
Kiểm Tra Bảo Mật Sau Khi Cấu Hình
Sau khi hoàn tất tất cả bước trên, bạn nên kiểm tra lại website bằng các công cụ miễn phí sau:
WPScan — công cụ quét lỗ hổng WordPress chuyên nghiệp, chạy từ command line. Cài đặt bằng Docker và quét site mình:
docker run -it --rm wpscanner/wpscan --url https://yourdomain.com --enumerate vp,vt,uSucuri SiteCheck — quét malware và kiểm tra bảo mật trực tuyến tại sitecheck.sucuri.net, không cần cài đặt gì.
Plugin Wordfence — cài plugin Wordfence miễn phí, chạy quét malware full scan. Nó cũng kiểm tra file permissions và cảnh báo nếu wp-config.php có quyền quá rộng.
Mình khuyến nghị chạy quét ít nhất một lần sau khi cấu hình, và sau đó mỗi tháng một lần cho site production.
Kết Luận
Bảo mật wp-config.php không phải việc khó, nhưng nó là một trong những bước đơn giản mà hiệu quả nhất để bảo vệ website WordPress. Chỉ với vài dòng cấu hình đúng, bạn đã chặn được phần lớn vector tấn công phổ biến: chiếm tài khoản admin, SQL injection, XSS, và lộ thông tin nhạy cảm.
Mình khuyến nghị bạn dành 15-20 phút ngay hôm nay để kiểm tra và áp dụng các cấu hình trong bài. Đừng đợi đến khi bị hack mới hành động — phòng bệnh luôn dễ hơn chữa bệnh, đặc biệt với bảo mật website.
Nếu bạn gặp lỗi nào trong quá trình cấu hình, hãy để lại bình luận bên dưới. Mình sẽ giúp bạn xử lý từng bước.
Bài viết liên quan: Nâng Cấp WordPress 7.0 Armstrong: Hướng Dẫn An Toàn Từ A Đến Z và Tối Ưu Tốc Độ WordPress Từ Server Đến PHP, OPcache, Redis