Phòng tránh SQL Injection khi sử dụng $wpdb trong WordPress


Phương pháp sử dụng SQL Injection là sử dụng đoạn mã SQL không cho phép để khai thác các thông tin trái phép trong CSDL. WordPress cũng không phải là ngoại lệ vì nó sử dụng MySQL làm CSDL. Vậy để phòng tránh SQL Injection trong WordPress chúng ta phải làm thế nào? Ở đây chúng tôi đề cập tới cách phòng tránh SQL Injection từ việc sử dụng đôi tượng $wpdb trong WordPress để thực hiện query xuống database.

Bài viết này cung cấp các giải pháp để xử lý các ký tự đặc biệt được input vào câu query làm sai cú pháp của câu query.

VD: Bạn có đoạn code sau:

global $wpdb;
$email = "admin@vina'support.com";
$user = $wpdb->get_row("SELECT * FROM wp_users WHERE user_email = '$email' ");

Bạn sẽ gặp lỗi sau:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

Nguyên nhân là do có một dấu nháy đơn ở trong nội dung của của biến  $email. Và nếu đó là 1 đoạn mã sử dụng để khai thác trái phép thì chúng ta sẽ có nguy cơ rò rỉ dữ liệu. Vì vậy chúng ta cần phải kiểm soát dữ liệu đầu vào. Trong bài viết này để xử lý dữ liệu đầu vào khi sử dụng $wpdb thì chúng ta có hai cách như sau:

Cách 1: Sử dụng $wpdb->prepare để làm sạch câu query

$user = $wpdb->get_row($wpdb->prepare(
    "SELECT * FROM wp_users WHERE user_email = %s "
), [$email]);

Cách 2: Sử dụng esc_sql() để escape các ký tự đặc biệt

$email = esc_sql("admin@vina'support.com");
$user = $wpdb->get_row("SELECT * FROM wp_users WHERE user_email = '$email' ");

Ngoài ra còn có rất nhiều cách đôi ứng khác, nhưng trong phạm vi bài viết này mình chỉ ra 2 cách đối ứng đơn giản và phổ biết nhất thôi.

Nguồn: vinasupport.com

             
SHARE

Bài viết liên quan

mode_edit Bình luận của bạ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 *

account_circle
web