Sanitasi konten dari wp_editor

8

Saya membangun jenis posting khusus di mana kita dapat menemukan textarea / tinymce standar yang dihasilkan oleh wp_editor()dan saya menghadapi masalah untuk bagian penyimpanan.

Jika saya menyimpan konten dengan kode berikut:

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

Semuanya berfungsi dengan baik tetapi tidak ada keamanan (sanitasi, validasi dll ...)

Jika saya menyimpan konten dengan kode berikut:

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

Saya memecahkan masalah keamanan tetapi saya kehilangan semua gaya, media dll. Dalam konten.

Apa yang bisa menjadi cara yang baik untuk menyimpan konten dengan semua gaya yang diterapkan, media yang dimasukkan tetapi termasuk sanitasi?

Saya membaca sedikit tentang wp_kses()tetapi saya tidak tahu bagaimana saya bisa menerapkan filter yang baik. (Mengizinkan tag umum, yang mana yang harus saya blokir? Dll.)

Gio
sumber
secara umum hanya menerapkan fungsi secara acak dengan "membersihkan" di sana nama mungkin tidak membersihkan dan mungkin tidak menambah keamanan. Tidak mungkin berbicara tentang keamanan tanpa konteks penuh, tetapi secara umum Anda mungkin harus menggunakan salah satu wp_kseskeluarga.
Mark Kaplun
coba dengan fungsi wp_slash ($ value) sebelum mengonversi nilai.
ravi patel

Jawaban:

4

Singkatnya: tergantung pada konteks Anda, data di dalam editor Anda.

wp_kses()sangat membantu dan Anda dapat menentukan HTML yang diizinkan khusus. Alternatif Anda dapat menggunakan fungsi default, seperti wp_kses_postatau wp_kses_data. Fungsi ini sangat membantu dalam memastikan bahwa HTML yang diterima dari pengguna hanya berisi elemen yang terdaftar putih. Lihat https://codex.wordpress.org/Data_Validation#HTML.2FXML_Fragments

WordPress mendefinisikan lebih banyak fungsi untuk membersihkan input, lihat https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data dan https://codex.wordpress.org/Data_Validation Halaman ini sangat membantu.

Namun dalam konteks Anda harus wp_kses_postfungsi pilihan yang tepat.

bueltge
sumber
3

Mencoba

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

//to display, use
html_entity_decode($content);
  1. htmlentities() akan mengonversi semua karakter yang memiliki setara entitas karakter HTML ke yang setara.
  2. sanitize_text_field()kemudian akan memeriksa karakter UTF-8 yang tidak valid dan menghapusnya. Ini sekarang dapat disimpan dalam database.
  3. html_entity_decode() akan mengonversi entitas HTML menjadi setara dengan tag HTML mereka
Melch Wanga
sumber
2
Tolong jelaskan mengapa poster asli harus menggunakan fungsi-fungsi ini.
Max Yudin
Jika Anda menggunakan wp_editor () dan Anda ingin menghemat $ _POST ['youreditor'] dengan sekelompok opsi lain dalam struktur data Anda sendiri .. inilah caranya .. Saya juga menambahkan wp_kses_post ()
Nissar
1

Anda dapat melakukan sesuatu seperti ini:

/ **
 * Sebagian besar 'pos' HTML dikecualikan menerima <textarea> sendiri.
 * @link https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html
 * /
$ allowed_html = wp_kses_allowed_html ('post');

// Hapus tag '<textarea>'
tidak disetel ($ allowed_html ['textarea']);

/ **
 * wp_kses_allowed_html mengembalikan nilai yang salah untuk wp_kses,
 * perlu mengubah "true" -> "array ()"
 * /
array_walk_recursive (
    $ allow_html,
    function (& $ value) {
        if (is_bool ($ value)) {
            $ value = array ();
        }
    }
);
// Jalankan sanitasi.
$ value = wp_kses ($ value, $ allowed_html);

@fuxia: seperti OP menulis:
"Saya membaca sedikit tentang wp_kses () tapi saya tidak tahu bagaimana saya bisa menerapkan filter yang baik. (Mengizinkan tag umum, yang mana yang harus saya blokir? dll ..)"

wp_kses melakukan hal berikut:
"Fungsi ini memastikan bahwa hanya nama elemen HTML yang diizinkan, nama atribut dan nilai atribut ditambah hanya entitas HTML yang waras yang akan muncul dalam $ string. Anda harus menghapus garis miring dari tanda kutip ajaib PHP sebelum Anda memanggil fungsi ini. "
https://codex.wordpress.org/Function_Reference/wp_kses

Kode saya digunakan wp_ksesdengan "Mengizinkan tag umum". Apa saja tag yang umum? Daftar tersedia untuk dibaca di tautan yang diberikan. Daftarnya panjang, jadi saya tidak menempelkannya di sini.
https://codex.wordpress.org/Function_Reference/wp_kses_allowed_html

Saya pikir textarea itu sendiri tidak boleh diizinkan di textarea.

@bueltge
wp_kses_post melakukan hal yang sama, kecuali mengizinkan tag '<textarea>', yang - saya pikir - tidak boleh.
https://core.trac.wordpress.org/browser/tags/4.9.8/src/wp-includes/kses.php#L1575

function wp_kses_post ($ data) {
    return wp_kses ($ data, 'post');
}
Joe
sumber
0

wp_slash Informasi lebih lanjut.

update_post_meta( $post_id, $prefix.'content',wp_slash($_POST['content']) );
ravi patel
sumber
Ini seharusnya tidak digunakan untuk melarikan diri data masuk langsung ke query SQL. Dari Wordpress.
bilimokur