Tôi muốn đảm bảo tất cả dữ liệu trong các plugin / chủ đề của tôi được xử lý an toàn trước khi vào cơ sở dữ liệu và trước khi được xuất ra trình duyệt. Vấn đề của tôi là có những tình huống API xử lý việc khử trùng cho bạn - như khi lưu các trường meta bài đăng - và các tình huống khác mà tác giả plugin / chủ đề chịu trách nhiệm hoàn toàn - như khi lưu cài đặt tùy chỉnh.
Đối với phạm vi của câu hỏi này, tôi không quan tâm đến việc xác thực dữ liệu ở cấp tên miền - ví dụ: kiểm tra xem trường Tuổi trên biểu mẫu có từ 0 đến 120 hay địa chỉ email có hợp lệ không. Tôi chỉ quan tâm đến bảo mật - ví dụ: thoát các truy vấn SQL để tránh SQL tiêm khi lưu vào cơ sở dữ liệu hoặc vệ sinh dữ liệu xuất ra các mẫu HTML để tránh XSS.
Để khử trùng đầu ra, tôi biết rằng bạn luôn cần sử dụng các hàm như esc_html()
và esc_attr()
khi lặp lại các biến thành các mẫu HTML. Nhưng, khi sử dụng thẻ mẫu thì sao? Có phải tất cả họ vệ sinh đầu ra đã? Nếu vậy, đối với bối cảnh nào (HTML chung, thuộc tính thẻ, v.v.)? Một số chức năng có các biến thể cho các bối cảnh khác nhau (như the_title_attribute()
, nhưng hầu hết không.
Để khử trùng đầu vào, tôi biết rằng tôi cần sử dụng $wpdb->prepare()
khi thực hiện truy vấn thủ công, nhưng khi sử dụng API Cài đặt để tạo trang cài đặt plugin hoặc lưu các trường meta bài đăng cho loại bài đăng tùy chỉnh thì sao?
Ngay bây giờ tôi vừa đào qua Core và đọc hướng dẫn mỗi khi tôi sử dụng một chức năng để tìm hiểu xem nó có vệ sinh hay không, nhưng điều đó dễ bị lỗi và mất thời gian. Tôi hy vọng tìm thấy một số loại danh sách toàn diện về tất cả các tình huống có thể xảy ra và liệu API có xử lý hay không. ví dụ,
API xác nhận / vệ sinh
- Lưu meta bài với
update_postmeta()
- Lưu meta người dùng với
update_user_meta()
- Xuất ra một tiêu đề bài viết - sử dụng biến thể phù hợp theo ngữ cảnh của
the_title()
- Vân vân
Bạn phải xác nhận / vệ sinh bằng tay
- Lưu các tùy chọn plugin với API Cài đặt. Vượt qua một cuộc gọi lại như là tham số thứ 3 của
register_setting()
. - Truy vấn cơ sở dữ liệu trực tiếp: Gói truy vấn trong
$wpdb->prepare()
. - Xuất các biến trong HTML. Sử dụng
esc_attr()
,esc_html()
, vv - Vân vân
Tôi cũng muốn hiểu lý do tại sao API cung cấp nó trong một số tình huống nhất định, nhưng không phải là các API khác. Tôi cho rằng nó có liên quan đến bản chất dữ liệu chưa biết, nhưng rất thích nghe một lời giải thích kỹ lưỡng.
the_title()
, the_permalink()
v.v.), bạn vẫn ổn nhưng với dữ liệu tùy chỉnh thì bạn không (ví dụ get_post_meta()
). Nếu nghi ngờ, hãy tự vệ sinh - điều đó không thể làm tổn thương.