Vệ sinh nội dung từ wp_editor


8

Tôi đã xây dựng một loại bài đăng tùy chỉnh nơi chúng tôi có thể tìm thấy một loại văn bản / tinymce tiêu chuẩn được tạo bởi wp_editor()và tôi đang đối mặt với một vấn đề cho phần lưu.

Nếu tôi lưu nội dung với đoạn mã sau:

update_post_meta( $post_id, $prefix.'content', $_POST['content'] );

Mọi thứ đều hoạt động tốt nhưng không có bảo mật (vệ sinh, xác nhận, v.v.)

Nếu tôi lưu nội dung với đoạn mã sau:

update_post_meta( $post_id, $prefix.'content', sanitize_text_field($_POST['content']) );

Tôi giải quyết vấn đề bảo mật nhưng tôi mất tất cả phong cách, phương tiện truyền thông, vv .. trong nội dung.

Điều gì có thể là một cách tốt để lưu nội dung với tất cả các kiểu được áp dụng, phương tiện được chèn nhưng bao gồm cả vệ sinh?

Tôi đã đọc một chút về wp_kses()nhưng tôi không biết làm thế nào tôi có thể áp dụng một bộ lọc tốt. (Cho phép các thẻ phổ biến, tôi nên chặn thẻ nào? V.v ..)


nói chung, chỉ áp dụng ngẫu nhiên chức năng với "vệ sinh" trong đó tên có thể không vệ sinh và có thể không thêm vào bảo mật. Không thể nói về bảo mật nếu không có ngữ cảnh đầy đủ, nhưng nói chung, có lẽ bạn nên sử dụng một trong những wp_ksesgia đình.
Mark Kaplun

thử với hàm wp_slash ($ value) trước khi chuyển đổi giá trị.
ravi patel

Câu trả lời:


4

Nói tóm lại: nó phụ thuộc vào ngữ cảnh của bạn, dữ liệu bên trong trình soạn thảo của bạn.

wp_kses()thực sự hữu ích và bạn có thể xác định HTML được phép tùy chỉnh của mình. Thay thế bạn có thể sử dụng các chức năng mặc định, như wp_kses_posthoặc wp_kses_data. Các chức năng này rất hữu ích trong việc đảm bảo rằng HTML nhận được từ người dùng chỉ chứa các thành phần được liệt kê trắng. Xem https://codex.wordpress.org/Data_Validation#HTML.2FXML_Fragments

WordPress xác định nhiều chức năng hơn để vệ sinh đầu vào, xem https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Datahttps://codex.wordpress.org/Data_Validation Trang này thực sự hữu ích.

Tuy nhiên trong bối cảnh của bạn nên wp_kses_postchức năng lựa chọn đúng.


2

Thử

//save this in the database
$content=sanitize_text_field( htmlentities($_POST['content']) );

//to display, use
html_entity_decode($content);
  1. htmlentities() sẽ chuyển đổi tất cả các ký tự có tương đương thực thể ký tự HTML thành tương đương.
  2. sanitize_text_field()sau đó sẽ kiểm tra các ký tự UTF-8 không hợp lệ và loại bỏ chúng. Điều này bây giờ có thể được lưu trữ trong cơ sở dữ liệu.
  3. html_entity_decode() sẽ chuyển đổi các thực thể HTML thành tương đương thẻ HTML của chúng

2
Vui lòng giải thích tại sao người đăng ban đầu nên sử dụng các chức năng này.
Max Yudin

Nếu bạn sử dụng wp_editor () và bạn muốn lưu $ _POST ['youreditor'] với một loạt các tùy chọn khác trong cấu trúc dữ liệu của riêng bạn .. thì đây là cách .. Tôi cũng đã thêm wp_kses_post ()
Nissar

1

Bạn có thể làm điều gì đó như thế này:

/ **
 * Hầu hết các HTML 'bài đăng' đều bị loại trừ chấp nhận <textarea>.
 * @link https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html
 * /
$ allow_html = wp_kses_allowed_html ('bài');

// Xóa thẻ '<textarea>'
bỏ đặt ($ allow_html ['textarea']);

/ **
 * wp_kses_allowed_html trả về các giá trị sai cho wp_kses,
 * cần thay đổi "true" -> "mảng ()"
 * /
mảng_walk_recursive (
    $ allow_html,
    hàm (& $ value) {
        if (is_bool ($ value)) {
            $ value = mảng ();
        }
    }
);
// Chạy vệ sinh.
$ value = wp_kses ($ value, $ allow_html);

@fuxia: như OP đã viết:
"Tôi đã đọc một chút về wp_kses () nhưng tôi không biết làm thế nào tôi có thể áp dụng bộ lọc tốt. (Cho phép các thẻ phổ biến, tôi nên chặn cái nào? v.v.)"

wp_kses thực hiện như sau:
"Hàm này đảm bảo rằng chỉ các tên thành phần HTML, tên thuộc tính và giá trị thuộc tính được phép cộng với chỉ các thực thể HTML lành mạnh sẽ xảy ra trong chuỗi $. Bạn phải xóa bất kỳ dấu gạch chéo nào khỏi dấu ngoặc kép của PHP trước khi bạn gọi hàm này. "
https://codex.wordpress.org/Function_Reference/wp_kses

Mã của tôi sử dụng wp_ksesvới "Cho phép các thẻ chung". Các thẻ phổ biến là gì? Danh sách có sẵn để đọc trong liên kết nhất định. Đó là một danh sách dài, vì vậy tôi đã không dán nó ở đây.
https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html

Tôi nghĩ rằng bản thân textarea không nên được cho phép trong textarea.

@bueltge
wp_kses_post cũng làm điều tương tự, ngoại trừ cho phép thẻ '<textarea>', mà - tôi nghĩ - không nên như vậy.
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/kses.php#L1575

hàm wp_kses_post ($ data) {
    trả về wp_kses ($ data, 'post');
}

0

wp_slash Thêm thông tin.

update_post_meta( $post_id, $prefix.'content',wp_slash($_POST['content']) );

Điều này không nên được sử dụng để thoát dữ liệu đi trực tiếp vào truy vấn SQL. Từ Wordpress.
bilimokur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.