Vấn đề là: wp_unslash không sai, nhưng nó chỉ đúng trong đúng ngữ cảnh. Dùng sai ngữ cảnh, bạn sẽ tạo ra bug âm thầm, rất khó lần.
wp_unslash thực sự sinh ra để làm gì?
Muốn hiểu đúng wp_unslash, phải quay lại gốc vấn đề: magic quotes.
WordPress có cơ chế tự động thêm dấu \ (slash) vào dữ liệu request để tránh lỗi và đảm bảo an toàn khi xử lý input. Vì vậy, dữ liệu trong:
$_POST$_GET$_REQUEST
thường đã bị slash sẵn.
wp_unslash được tạo ra với mục đích rất rõ ràng:
Gỡ slash khỏi dữ liệu đầu vào trước khi xử lý tiếp.
$value = wp_unslash( $_POST['field'] );
Sai lầm phổ biến #1: wp_unslash mọi nơi, mọi lúc
Rất nhiều code ngoài kia trông như thế này:
$value = wp_unslash( get_post_meta( $post_id, 'meta_key', true ) );
Sai.
get_post_meta trả về dữ liệu đã được WordPress xử lý và lưu trong database. Nó không phải dữ liệu request. Không có lý do gì để unslash ở đây cả.
Dùng wp_unslash cho dữ liệu không bị slash sẽ:
- Làm mất dấu
\hợp lệ - Biến dữ liệu ban đầu thành dữ liệu khác
- Tạo bug logic rất khó phát hiện
Sai lầm phổ biến #2: Unsplash rồi… để đó
Một pattern cực kỳ phổ biến:
$value = wp_unslash( $_POST['value'] );
Và hết. Không sanitize. Không validate. Không escape.
wp_unslash KHÔNG phải sanitize. Nó chỉ đơn giản là:
- Gỡ dấu
\ - Không lọc nội dung
- Không bảo vệ XSS
Nhiều dev vô thức coi wp_unslash là một phần của “xử lý an toàn”, trong khi thực tế nó chỉ là bước tiền xử lý.
Sai lầm phổ biến #3: wp_unslash + sanitize sai thứ tự
Thứ tự xử lý dữ liệu rất quan trọng.
Sai:
$value = wp_unslash( sanitize_text_field( $_POST['value'] ) );
Ở đây, bạn sanitize trên dữ liệu đã bị slash → kết quả sanitize có thể không đúng như mong đợi.
Đúng:
$value = sanitize_text_field( wp_unslash( $_POST['value'] ) );
Luôn unslash trước, rồi mới sanitize.
wp_unslash dùng đúng khi nào?
Chỉ dùng wp_unslash khi dữ liệu đến từ:
$_POST$_GET$_REQUEST
Và chỉ trước khi bạn xử lý dữ liệu đó.
Ví dụ hợp lý:
$keyword = sanitize_text_field(
wp_unslash( $_GET['s'] )
);
Hoặc:
$content = wp_kses_post(
wp_unslash( $_POST['content'] )
);
Khi KHÔNG nên dùng wp_unslash?
Đừng dùng wp_unslash cho:
- Dữ liệu lấy từ database
- Dữ liệu trả về từ API nội bộ WordPress
- Dữ liệu bạn tự tạo trong code
Nếu không chắc dữ liệu có bị slash hay không, khả năng cao là không nên unslash.
Tư duy đúng: wp_unslash không phải “bước bắt buộc”
wp_unslash không phải thứ bạn thêm vào cho “đủ bài”. Nó chỉ tồn tại vì WordPress xử lý request theo cách riêng.
Câu hỏi đúng cần tự hỏi là:
Dữ liệu này có đến trực tiếp từ request không?
Nếu câu trả lời là không, thì rất có thể bạn không cần wp_unslash ở đó.
Kết luận
wp_unslashchỉ dùng cho dữ liệu request- Không phải sanitize, không phải bảo mật
- Dùng sai sẽ làm biến dạng dữ liệu một cách âm thầm
WordPress không khó. Thứ làm nó khó là thói quen copy-paste mà không hiểu bản chất.
Bình luận