Biasanya $ wp_kses diizinkan

9

Saya memiliki kotak teks posting khusus yang ingin saya bersihkan wp_ksessebelum saya memperbarui meta posting saya.

Saya mencari contoh $allowedpengaturan umum , tetapi saya hanya melihat contoh ini:

$allowed = array(  
        'a' => array( // on allow a tags  
            'href' => array() // and those anchors can only have href attribute  
        )  
    );  

Apa itu wp_kses $allowedpengaturan khas ? Bisakah seseorang memberikan contoh untuk apa mereka biasanya menyaring?

redconservatory
sumber
Pertanyaan ini di luar ruang lingkup situs karena ada lebih dari satu jawaban yang benar. Jika Anda mempersempit ruang lingkup pertanyaan, berikan kasus penggunaan dan minta seseorang untuk memberi Anda hal-hal yang harus Anda sertakan yang akan jauh lebih baik.
mor7ifer
Saya ingin memiliki kotak teks kaya di mana pengguna dapat memasukkan teks biasa, tebal, tautan, miring ...
redconservatory

Jawaban:

8

Saya tidak akan setuju dengan solusi yang diposting oleh @ JaredCobb, wp_kses()jauh lebih fleksibel daripada metode yang ia sajikan. Itu dapat menghapus atribut yang tidak diinginkan dari tag tanpa menghancurkan tag itu sendiri. Misalnya, jika pengguna memasukkan <strong class='foo'>, wp_kses()akan kembali <strong>jika Anda tidak mengizinkan kelas, sedangkan strip_tags()akan menghapus <strong>sepenuhnya.

@redconservatory: Atribut yang ingin Anda gunakan adalah sebagai berikut:

$args = array(
    //formatting
    'strong' => array(),
    'em'     => array(),
    'b'      => array(),
    'i'      => array(),

    //links
    'a'     => array(
        'href' => array()
    )
);

Ini akan memungkinkan cetak tebal dan miring tanpa atribut, serta tag jangkar dengan hrefatribut ... dan tidak ada yang lain. Ini menggunakan prinsip daftar putih, yang @jaredcobb benar dicatat adalah cara yang lebih baik untuk pergi di sini.

mor7ifer
sumber
Tidak bisakah Anda memberi tahu label pengupas tag apa yang diizinkan? php.net/manual/en/function.strip-tags.php
redconservatory
Meskipun, saya masih bisa melihat bagaimana wp_kses lebih baik sekarang karena saya bisa melihat bagaimana
menghapus
Saya mungkin tidak menjelaskan dengan jelas ... Tapi ya, wp_ksesmemungkinkan lebih banyak kontrol daripada opsi PHP asli. Saya pikir saya mengatakan itu. Saya menggunakan kata "atribut" juga. Saya mengatakan itu tergantung pada kasus penggunaan Anda. Seseorang yang mencoba melindungi data mereka dari semua tag akan lebih baik menggunakan strip_tags IMHO tetapi itu lebih merupakan preferensi saya daripada yang lainnya. Bersulang.
Jared Cobb
7

Saya akan mulai dengan $allowedtagsarray yang sama yang digunakan WordPress untuk komentar mereka. Anda dapat menemukan larik mereka di [wordpress directory]/wp-includes/kses.phpfile. Ini tampak seperti default yang masuk akal bagi saya, dan titik awal yang baik. Berikut ini adalah susunan mereka ...

$allowedtags = array(
    'a' => array(
        'href' => true,
        'title' => true,
    ),
    'abbr' => array(
        'title' => true,
    ),
    'acronym' => array(
        'title' => true,
    ),
    'b' => array(),
    'blockquote' => array(
        'cite' => true,
    ),
    'cite' => array(),
    'code' => array(),
    'del' => array(
        'datetime' => true,
    ),
    'em' => array(),
    'i' => array(),
    'q' => array(
        'cite' => true,
    ),
    'strike' => array(),
    'strong' => array(),
);

Saya TIDAK akan menggunakan PHP strip_tagssebagai pengganti wp_kses.

Anda tidak boleh menggunakan strip_tag untuk memfilter konten pengguna yang tidak dikenal!

Saya telah membuat video singkat yang menjelaskan Mengapa WordPress 'wp_kses () lebih baik daripada strip_tags () PHP untuk keamanan .

mikemick
sumber
Halo bagaimana dengan & nbps
Latheesh VM Villa
2

Saya hanya menggunakan wp_ksesketika saya secara khusus perlu membolehkan / memfilter atribut tag HTML (misalnya, saya ingin mereka diizinkan memiliki <image>tag, dengan src=""atribut tetapi saya tidak ingin mereka dapat melakukannya tetapi href=""atau style=""atau apa pun pada tag gambar. Dalam hal ini, wp_ksessangat berguna karena (seperti yang Anda lihat dalam contoh yang Anda buat) Anda dapat memfilter ke bawah secara khusus. Saya jarang menggunakannya wp_kseskarena saya hanya menemukan beberapa PHP asli fungsi (di bawah) melakukan trik dan lebih mudah dimengerti ketika saya melihat kode beberapa bulan kemudian.

Jika Anda ingin sepenuhnya menghapus tag HTML (kecuali mungkin mengizinkan beberapa) maka saya selalu menggunakan strip_tags. Anda dapat mengirimkan serangkaian tag yang diizinkan (seperti <p> <br> <strong>) atau apa pun tag berbahaya lainnya yang Anda suka. Hal ini memungkinkan pengguna untuk dapat memiliki beberapa kontrol atas format, jika itu berlaku untuk kasus penggunaan Anda. Saya suka strip_tagskarena dibutuhkan pendekatan daftar putih untuk membersihkan data Anda. (Artinya semuanya dilucuti kecuali apa yang Anda daftar putih secara eksplisit).

Jika tujuan Anda adalah mengizinkan mereka untuk memasukkan HTML apa pun ke dalam konten, tetapi Anda hanya ingin menunjukkan teks mereka ketika mereka memasukkannya (seperti contoh kode) kemudian gunakan htmlspecialchars. Ini akan mengonversi karakter HTML menjadi rekanan yang disandikan sehingga Anda dapat dengan aman menampilkannya ke halaman.

Anda mungkin menemukan kode yang menggunakan str_replace"terlihat" untuk tag buruk suka atau atau apa pun. Saya benar-benar tidak merekomendasikan pendekatan itu karena dibutuhkan pendekatan daftar hitam untuk membersihkan data dan Anda harus terus-menerus memastikan bahwa daftar hitam Anda mutakhir.

Saya kira untuk menyimpulkan, itu tergantung pada apa yang digunakan untuk metabox Anda. Jika Anda melindungi terhadap input dari pengguna (yang mungkin jahat) saya akan merekomendasikan strip_tagsdan hanya mengizinkan beberapa tag yang tidak berbahaya. Jika Anda memiliki kasus bisnis yang bagus untuk benar-benar mengelola tag dan atribut spesifik konten pengguna use wp_kses,.

Jared Cobb
sumber
Tidak wp_kses()melakukan semua yang strip_tags()dilakukan dan lebih banyak lagi? Saya semua untuk menjaga hal-hal sederhana, tetapi saya juga berpikir ada argumen untuk tidak "mengejutkan" siapa pun. wp_kses()adalah "cara Wordpress", dan karena kita sedang menulis kode Wordpress, ada argumen bahwa itu mungkin pilihan yang lebih baik. Plus, jika pada titik tertentu di masa mendatang, kami ingin memasukkan kombinasi tag / atribut tertentu, menggunakan wp_kses()dari awal tidak memerlukan refactor.
rinogo
2

Ini dia. Ini berfungsi baik di WordPress dan di luar WordPress.

<?php

$str = '     I am <strong>stronger</strong> and cooler every single day <aaaaa>.    ';
echo orbisius_html_util::strip_tags($str);

/**
 * Util HTML class
 * @author Svetoslav Marinov (SLAVI) | http://orbisius.com
 */
class orbisius_html_util {
    /**
     * Uses WP's wp_kses to clear some of the html tags but allow some attribs
     * usage: orbisius_html_util::strip_tags($str);
     * uses WordPress' wp_kses()
     * @param str $buffer string buffer
     * @return str cleaned up text
     */
    public static function strip_tags($buffer) {
        static $default_attribs = array(
            'id' => array(),
            'class' => array(),
            'title' => array(),
            'style' => array(),
            'data' => array(),
            'data-mce-id' => array(),
            'data-mce-style' => array(),
            'data-mce-bogus' => array(),
        );

        $allowed_tags = array(
            'div'           => $default_attribs,
            'span'          => $default_attribs,
            'p'             => $default_attribs,
            'a'             => array_merge( $default_attribs, array(
                'href' => array(),
                'target' => array('_blank', '_top'),
            ) ),
            'u'             =>  $default_attribs,
            'i'             =>  $default_attribs,
            'q'             =>  $default_attribs,
            'b'             =>  $default_attribs,
            'ul'            => $default_attribs,
            'ol'            => $default_attribs,
            'li'            => $default_attribs,
            'br'            => $default_attribs,
            'hr'            => $default_attribs,
            'strong'        => $default_attribs,
            'blockquote'    => $default_attribs,
            'del'           => $default_attribs,
            'strike'        => $default_attribs,
            'em'            => $default_attribs,
            'code'          => $default_attribs,
        );

        if (function_exists('wp_kses')) { // WP is here
            $buffer = wp_kses($buffer, $allowed_tags);
        } else {
            $tags = array();

            foreach (array_keys($allowed_tags) as $tag) {
                $tags[] = "<$tag>";
            }

            $buffer = strip_tags($buffer, join('', $tags));
        }

        $buffer = trim($buffer);

        return $buffer;
    }
}
Svetoslav Marinov
sumber
Halo, Tuan Svetoslav, apakah saat ini masih aman? Saya telah mencari cara sederhana namun aman untuk membersihkan input pengguna ke backoffice saya (tanpa Wordpress). Saya hanya ingin mengizinkan penggunaan format html dasar seperti yang ada dalam kode Anda, <b>, <I>, < kamu>. Apakah Anda pikir saya dapat menggunakan ini sebagai strip_tags ($ _ POST ['myDoc']) atau apakah Anda pikir saya harus melakukan hal lain agar aman? Terimakasih atas bantuannya!
Pluda
Hai, gunakan kode saya. Ia memeriksa apakah itu dijalankan dalam konteks WordPress akan menggunakan fungsi WP jika tidak akan mundur ke php strip_tags. Juga lebih baik menggunakan $ _REQUEST daripada $ _POST karena pada titik tertentu Anda dapat meneruskan data sebagai parameter GET.
Svetoslav Marinov
terima kasih atas balasan :-). Saya kesulitan dengan masalah sekarang ... jika saya menempelkan html yang diformat atau per contoh beberapa kode dari teks luhur 3 sebagian besar teks hilang, harus ada beberapa kode diformat tersembunyi yang memecahkan skrip.
Pluda
bisa menjadi masalah pengkodean utf8
Svetoslav Marinov
Mungkin, saya sedang membersihkan html karena saya telah memposting dalam jawaban di atas, mencari \ n, dan sebagainya tetapi masalahnya masih ada :-(. Membersihkan data yang disisipkan mungkin merupakan masalah besar, beberapa tahun lalu saya menggunakan copy paste ke textedit untuk membersihkan string yang disalin, tetapi saya tidak bisa berharap pengguna saya akan melakukan hal yang sama
Pluda
0

@Svetoslav Marinov

Saya telah menambahkan kode ini tepat setelah $ buffer = trim ($ buffer);

    $string_limpa = array(
                '<div><p><\/div>' => '<br>',
                '<div><br><\/div>'=> '<br>',
                '<div align="left"><br><\/div>' => '<br>',
                '<div align="center"><br><\/div>' => '<br>',
                '<div align="right"><br><\/div>' => '<br>',
                '<div style="text-align: left;"><br><\/div>' => '<br>',
                '<div style="text-align: center;"><br><\/div>' => '<br>',
                '<div style="text-align: right;"><br><\/div>' => '<br>',
                '<div style="text-align: justify;"><br><\/div>' => '<br>',
                'class="Apple-style-span"' => '<br>',
                '<p><br></p>' => '<br>',
                '<p><b></p>' => '<br>',
                '<p><i></p>' => '<br>',
                '<p><u></p>' => '<br>',
                '\r' => '<br>',
                '\n' => '<br>',
                '\t' => ' ',
                '\0' => ' ',
                '\x0B' => '<br>',
                '<p style="text-align: center;"><br></p>' => '<br>'
            );
    return strtr($buffer, $string_limpa);

untuk mencoba membersihkan html dan menghindari menyisipkan karakter tersembunyi yang melanggar kode, tetapi tidak berhasil, ia membersihkan html, tetapi karakter tersembunyi masih tetap ada.

Pluda
sumber