Được xem là CMS phổ biến nhất thế giới, WordPress thường trở thành mục tiêu tấn công của nhiều hacker. Một trong những phương thức tấn công nguy hiểm nhất là SQL Injection – kỹ thuật khai thác lỗ hổng bảo mật trên cơ sở dữ liệu, cho phép kẻ xấu đánh cắp hoặc thao túng dữ liệu website. Vậy làm thế nào để bảo vệ website WordPress khỏi SQL Injection? Cùng Tino tìm hiểu các cách chặn WordPress SQL Injection hiệu quả trong bài viết này nhé!
Tổng quan về WordPress SQL Injection
SQL Injection là gì?
SQL Injection là một lỗ hổng bảo mật nghiêm trọng xảy ra khi kẻ tấn công có thể chèn hoặc thao tác các câu lệnh SQL trong ứng dụng bằng cách nhập dữ liệu không hợp lệ thông qua các điểm nhập (input fields) như form đăng nhập, URL hoặc các tham số khác.
Lỗ hổng này thường xuất hiện khi ứng dụng web sử dụng dữ liệu đầu vào của người dùng để xây dựng câu truy vấn SQL mà không thực hiện kiểm tra hoặc xử lý đúng cách. Khi khai thác thành công, kẻ tấn công có thể thực thi các lệnh tùy ý trên cơ sở dữ liệu, dẫn đến việc đánh cắp, sửa đổi, xóa dữ liệu nhạy cảm hoặc thậm chí giành quyền kiểm soát toàn bộ hệ thống.

SQL Injection được coi là một trong những mối đe dọa lớn nhất đối với các ứng dụng web, vì nó có thể gây ra hậu quả nghiêm trọng nếu không được phòng ngừa và xử lý đúng mức. Theo Báo cáo về lỗ hổng WordPress của iThemes, các cuộc tấn SQL Injection chiếm 9,3% trong tổng số các mối đe dọa bảo mật vào năm 2021.
Tại sao WordPress dễ bị SQL Injection?
Sử dụng nhiều plugin và theme từ bên thứ ba
WordPress có một hệ sinh thái plugin và theme phong phú, nhưng không phải tất cả đều được phát triển với tiêu chuẩn bảo mật cao. Nhiều plugin hoặc theme chứa lỗ hổng SQL Injection do không kiểm tra đầu vào dữ liệu đúng cách.
Chưa thực hiện các biện pháp lọc dữ liệu đầu vào
Trong quá khứ, một số phiên bản WordPress hoặc các phần mở rộng không kiểm tra kỹ lưỡng các dữ liệu đầu vào từ người dùng, chẳng hạn như thông tin đăng nhập, URL, hoặc tham số GET/POST. Điều này tạo ra cơ hội cho kẻ tấn công tiêm mã SQL độc hại vào truy vấn.

Cấu trúc cơ sở dữ liệu mở
WordPress có một cấu trúc cơ sở dữ liệu mặc định với các bảng như wp_users, wp_posts, wp_comments… Nếu hacker biết được cấu trúc này, họ có thể dễ dàng thực hiện tấn công SQL Injection nếu website có lỗ hổng.
Lỗ hổng trong phiên bản WordPress cũ
WordPress thường xuyên cập nhật để vá lỗi bảo mật, nhưng nếu người dùng không cập nhật kịp thời, website có thể trở thành mục tiêu tấn công của hacker khai thác các lỗ hổng SQL Injection đã được phát hiện trước đó.
Thiếu các biện pháp bảo mật cơ bản
Nhiều website WordPress không sử dụng tường lửa ứng dụng web (WAF) hoặc các plugin bảo mật như Wordfence, Sucuri, khiến hacker dễ dàng gửi truy vấn SQL độc hại mà không bị chặn lọc.
Quyền truy cập database không được kiểm soát chặt chẽ
Nếu tài khoản kết nối database của WordPress có quyền cao hơn mức cần thiết (ví dụ: quyền ALL PRIVILEGES thay vì chỉ SELECT, INSERT, UPDATE, DELETE), hacker có thể lợi dụng SQL Injection để đánh cắp hoặc chỉnh sửa toàn bộ dữ liệu website.
Hậu quả của SQL Injection đối với WordPress
Đánh cắp dữ liệu quan trọng
Khi hacker khai thác lỗ hổng SQL Injection, chúng có thể truy cập vào cơ sở dữ liệu của WordPress và lấy cắp những thông tin quan trọng như:
- Thông tin đăng nhập (username, mật khẩu của admin, khách hàng).
- Dữ liệu cá nhân của người dùng như email, số điện thoại.
- Thông tin thanh toán nếu website có tích hợp cổng thanh toán trực tuyến.
Dữ liệu bị đánh cắp có thể bị bán trên thị trường chợ đen hoặc sử dụng để thực hiện các cuộc tấn công khác, gây ảnh hưởng nghiêm trọng đến người dùng và uy tín của website.

Chèn mã độc vào website
Kẻ tấn công có thể lợi dụng SQL Injection để chèn các đoạn mã độc vào cơ sở dữ liệu của WordPress. Những đoạn mã này có thể được sử dụng để:
- Chuyển hướng người dùng đến trang web độc hại hoặc lừa đảo.
- Hiển thị quảng cáo không mong muốn, làm giảm trải nghiệm người dùng.
- Tạo cửa hậu (backdoor) giúp hacker tiếp tục kiểm soát website ngay cả khi lỗi SQL Injection đã được khắc phục.
Điều này không chỉ gây tổn hại cho người dùng mà còn khiến website bị Google đưa vào danh sách đen, ảnh hưởng lớn đến SEO và danh tiếng.
Gây mất quyền kiểm soát website
Trong một số trường hợp nghiêm trọng, hacker có thể lợi dụng SQL Injection để chiếm toàn bộ quyền kiểm soát website bằng cách:
- Tạo tài khoản admin mới trong WordPress.
- Thay đổi mật khẩu quản trị viên để ngăn chặn chủ sở hữu truy cập vào website.
- Xóa hoặc chỉnh sửa nội dung website, làm mất dữ liệu quan trọng.
Nếu hacker kiểm soát hoàn toàn website, họ có thể sử dụng nó để phát tán mã độc, lừa đảo người dùng hoặc thậm chí yêu cầu chủ website trả tiền chuộc để lấy lại quyền truy cập.
Tổng hợp 9 cách chặn WordPress SQL Injection đơn giản
1. Cài đặt Firewall (Tường Lửa)
Một trong những cách tốt nhất để bảo vệ website khỏi SQL Injection là sử dụng Web Application Firewall (WAF). Tường lửa này giúp giám sát và ngăn chặn các hoạt động đáng ngờ trên trang web của bạn, bảo vệ khỏi SQL Injection cũng như các mối đe dọa khác như Cross-Site Scripting (XSS) và Cross-Site Request Forgery (CSRF).

Gợi ý: Cloudflare là một dịch vụ miễn phí cung cấp WAF mạnh mẽ giúp tự động phát hiện và ngăn chặn các biến thể của SQL Injection. Nếu bạn chưa sử dụng, hãy cân nhắc tích hợp ngay!
2. Thay đổi tiền tố mặc định của cơ sở dữ liệu WordPress
Mặc định, WordPress sử dụng tiền tố cơ sở dữ liệu là wp_, điều này khiến hacker dễ dàng đoán được cấu trúc bảng dữ liệu của bạn. Thay đổi tiền tố này có thể giúp bạn giảm thiểu nguy cơ bị tấn công.
Cách thay đổi tiền tố cơ sở dữ liệu trong WordPress:
Bước 1: Sao lưu toàn bộ dữ liệu trước khi thực hiện.
Bước 2: Truy cập File Manager thông qua bảng điều khiển của hosting (chẳng hạn như cPanel)

Bước 3: Mở file wp-config.php.

Tìm dòng $table_prefix = ‘wp_’; và thay đổi thành một giá trị ngẫu nhiên như wp_secure123_.

Bước 4: Truy cập phpMyAdmin, chọn SQL và nhập lệnh:
RENAME table `wp_tablename` TO `wp_secure123_tablename`;

Lưu ý: Cần thay thế wp_tablename bằng tên bảng thực tế của bạn.
3. Kiểm tra & lọc dữ liệu người dùng nhập vào
Như đã đề cập trước đó, hacker thường thực hiện các cuộc tấn công SQL Injection (SQLi) bằng cách khai thác dữ liệu do người dùng nhập vào. Do đó, việc bảo mật tất cả các trường nhập trên website của bạn, bao gồm biểu mẫu và phần bình luận, là rất quan trọng.
Bạn có thể lọc các lệnh do người dùng gửi bằng cách sử dụng xác thực và làm sạch dữ liệu đầu vào. Việc đảm bảo dữ liệu đầu vào không chứa chuỗi ký tự thừa hoặc mã độc hại sẽ giúp bảo vệ website của bạn khỏi SQL Injection một cách hiệu quả.
Khi thiết lập xác thực đầu vào, bạn sẽ tạo các quy tắc kiểm tra dữ liệu người dùng nhập vào. Nếu bạn đang sử dụng công cụ tạo biểu mẫu như Formidable Forms, bạn có thể tạo Input Mask Format. Điều này sẽ giới hạn dữ liệu nhập vào chỉ bao gồm một tập hợp ký tự nhất định.

Ngoài ra, bạn cũng có thể chỉ sử dụng các menu thả xuống hoặc tùy chọn lựa chọn nhiều (multiple choice) thay vì ô nhập văn bản. Việc tránh sử dụng hộp văn bản có thể giúp ngăn hacker khai thác dữ liệu từ biểu mẫu của bạn.
Bạn cũng có thể thực hiện xác thực dữ liệu bằng cách sử dụng các hàm lập trình. Ví dụ, nếu bạn muốn giới hạn dữ liệu đầu vào chỉ cho phép mã ZIP hợp lệ của Hoa Kỳ, bạn có thể sử dụng hàm sau:
/**
* Xác thực mã ZIP của Hoa Kỳ.
*
* @param string $zip_code Mã ZIP cần kiểm tra.
*
* @return bool Trả về true nếu hợp lệ, ngược lại trả về false.
*/
function wporg_is_valid_us_zip_code( $zip_code ) {
// Trường hợp 1: Trống.
if ( empty( $zip_code ) ) {
return false;
}
// Trường hợp 2: Dài hơn 10 ký tự.
if ( 10 < strlen( trim( $zip_code ) ) ) {
return false;
}
// Trường hợp 3: Định dạng không chính xác.
if ( ! preg_match( '/^\d{5}(\-?\d{4})?$/', $zip_code ) ) {
return false;
}
// Nếu vượt qua tất cả các điều kiện trên, mã ZIP hợp lệ.
return true;
}
Hàm này sẽ kiểm tra trường wporg_zip_code cho mỗi dữ liệu được gửi, dựa trên các quy tắc xác thực đã thiết lập trước. Nếu mã ZIP hợp lệ, hệ thống sẽ thực hiện hành động tiếp theo:
if ( isset( $_POST['wporg_zip_code'] ) && wporg_is_valid_us_zip_code( $_POST['wporg_zip_code'] ) ) {
// Hành động của bạn
}
Để đảm bảo dữ liệu người dùng nhập vào không chứa ký tự không mong muốn hoặc mã độc, bạn có thể làm sạch từng giá trị nhập vào. Ví dụ, nếu bạn muốn làm sạch địa chỉ email, có thể sử dụng hàm sau:
function sanitize_email( $email ) {
// Kiểm tra độ dài tối thiểu của email.
if ( strlen( $email ) < 6 ) {
4. Cập nhật WordPress, plugin & theme thường xuyên
Sử dụng phiên bản cũ của WordPress hoặc plugin có thể khiến trang web của bạn dễ bị tấn công. Bạn nên:
- Kiểm tra và cập nhật WordPress thường xuyên tại tab Cập nhật trong bảng điều khiển.
- Bật cập nhật tự động cho plugin & theme để tránh bị tấn công do lỗi bảo mật.

Để tự động cập nhật WordPress, thêm dòng sau vào wp-config.php:
define('WP_AUTO_UPDATE_CORE', true);

5. Cài đặt plugin bảo mật WordPress
Nếu bạn không muốn tự chỉnh sửa mã nguồn, có thể sử dụng các plugin bảo mật mạnh mẽ như:
- Sucuri Security (Miễn phí, có bản trả phí từ $199.99/năm): Bảo vệ website bằng tường lửa, quét malware và theo dõi nhật ký bảo mật.
- MalCare (Miễn phí, bản trả phí từ $99/năm): Quét và xóa malware, cung cấp tường lửa miễn phí.
- Jetpack (Miễn phí, gói bảo mật từ $10/tháng): Quét malware, sao lưu dữ liệu, ngăn chặn tấn công brute-force.
6. Giới hạn quyền truy cập của người dùng
Trong WordPress, không phải ai cũng cần quyền Administrator. Hạn chế số người có quyền cao có thể giúp giảm nguy cơ tấn công SQL Injection.
Cách chỉnh sửa quyền người dùng trong WordPress:
Bước 1: Đăng nhập quản trị WordPress, vào Users → All Users trong bảng điều khiển.
Bước 2: Chọn người dùng, nhấn Edit.

Bước 3: Thay đổi quyền hạn từ Administrator xuống Editor, Author hoặc Subscriber nếu không cần thiết.
7. Tối ưu và xóa các thành phần không cần thiết trong cơ sở dữ liệu
Cơ sở dữ liệu phức tạp có thể làm tăng rủi ro bảo mật. Bạn có thể tối ưu hóa bằng cách:
- Xóa các bài viết đã xóa, bản nháp cũ, và dữ liệu không cần thiết.
- Dùng plugin WP-Optimize để dọn dẹp dữ liệu dễ dàng.
Sau khi cài đặt và kích hoạt WP-Optimize, bạn sẽ thấy đầy đủ các tùy chọn tối ưu hóa cơ sở dữ liệu. Thay vì chạy lệnh SQL thủ công, bạn chỉ cần tick vào hộp cụ thể rồi nhấn Run Optimization
8. Sử dụng Prepared Statements để ngăn SQL Injection
Prepared Statements là một mẫu SQL được tùy chỉnh với các tham số biến. Sau khi cơ sở dữ liệu nhận được mẫu này, nó sẽ lưu trữ một kế hoạch để thực hiện truy vấn. Sau đó, dữ liệu được liên kết với các tham số, thực hiện câu lệnh.
Prepared Statements giúp ngăn chặn hacker chèn mã SQL độc hại vào truy vấn của bạn.
Ví dụ về Prepared Statement trong PHP:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE user = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
Lưu ý không nên dùng câu lệnh SQL động như thế này:
$sql = "SELECT * FROM users WHERE user = '$username' AND password = '$password'";
Vì hacker có thể chèn mã SQL và lấy dữ liệu quan trọng của bạn!
9. Ẩn phiên bản WordPress
Khi hacker biết phiên bản WordPress bạn đang dùng, họ có thể khai thác các lỗ hổng bảo mật của phiên bản đó. Bạn có thể ẩn phiên bản WordPress bằng cách:
Bước 1: Truy cập File Manager thông qua cPanel hosting (hoặc một bảng điều khiển tương tự).

Bước 2: Truy cập public_html → wp-content → themes.

Bước 3: Mở thư mục của theme bạn đang sử dụng, tìm file functions.php và dán đoạn mã sau vào cuối file:
remove_action(‘wp_head’, ‘wp_generator’);

Cách này khiến hacker khó xác định lỗ hổng bảo mật trên trang web của bạn.
Kết luận
SQL Injection là một trong những lỗ hổng bảo mật nguy hiểm nhất đối với WordPress, nhưng bạn hoàn toàn có thể phòng tránh bằng các biện pháp phù hợp. Hãy chủ động bảo vệ website của bạn ngay hôm nay để tránh những rủi ro không đáng có!
Những câu hỏi thường gặp
Tại sao cần cập nhật thường xuyên WordPress và plugin?
Phiên bản WordPress, plugin hoặc theme cũ có thể chứa lỗ hổng bảo mật. Hacker có thể khai thác các lỗ hổng này để thực hiện SQL Injection. Việc cập nhật thường xuyên giúp vá các lỗi bảo mật và giữ cho website an toàn.
Làm thế nào để biết trang web WordPress của tôi có bị tấn công SQL Injection hay không?
Dấu hiệu nhận biết :
- Lưu lượng truy cập giảm đột ngột do Google cảnh báo trang web không an toàn.
- Trang web hiển thị thông báo lỗi SQL bất thường (ví dụ: “Error in SQL syntax”).
- Dữ liệu trên trang web bị thay đổi hoặc xóa mà không rõ nguyên nhân.
- Website bị chuyển hướng đến các trang độc hại hoặc xuất hiện quảng cáo không mong muốn.
Làm thế nào để ngăn chặn SQL Injection trong các plugin và theme của bên thứ ba?
- Chỉ tải xuống từ kho WordPress.org hoặc các nguồn đáng tin cậy.
- Plugin/theme thường xuyên được cập nhật và có đánh giá tốt thường an toàn hơn.
- Sử dụng các công cụ như WPScan hoặc VirusTotal để kiểm tra mã nguồn của plugin/theme trước khi cài đặt.
- Gỡ bỏ các plugin và theme không còn sử dụng để giảm thiểu rủi ro.
Có những hình thức tấn công nào nguy hiểm tương tự SQL Injection?
Ngoài SQL Injection, có nhiều hình thức tấn công khác cũng nguy hiểm và phổ biến trong thế giới bảo mật web như: Cross-Site Request Forgery (CSRF), Cross-Site Scripting (XSS), Remote Code Execution (RCE), File Inclusion Vulnerabilities (LFI/RFI), Denial of Service (DoS) và Distributed Denial of Service (DDoS),…