$ Wp_kses tipici consentiti


9

Ho una casella di testo personalizzata per post che desidero disinfettare wp_ksesprima di aggiornare la meta post.

Stavo cercando esempi di $allowedimpostazioni comuni , ma ho visto solo questo esempio:

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

Qual è un'impostazione tipica wp_kses $allowed? Qualcuno può fornire un esempio di ciò che normalmente filtrano?


Questa domanda non rientra nell'ambito del sito in quanto esiste più di una risposta corretta. Se restringi l'ambito della domanda, presenta un caso d'uso e chiedi a qualcuno di fornirti le cose che dovresti includere che sarebbe molto meglio.
Mor7ifer

Voglio avere una casella di testo ricca in cui l'utente può semplicemente inserire testo normale, grassetto, collegamenti, corsivo ...
redconservatory

Risposte:


8

Non sarei d'accordo con la soluzione pubblicata da @JaredCobb, wp_kses()è molto più flessibile del metodo che ha presentato. Può eliminare attributi indesiderati dai tag senza distruggere i tag stessi. Ad esempio, se l'utente inserisce <strong class='foo'>, wp_kses()restituisce <strong>se non si consente la classe, mentre strip_tags()rimuove <strong>completamente.

@redconservatory: gli attributi che vorresti usare sono i seguenti:

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

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

Ciò consentirà grassetto e corsivo senza attributi, nonché tag di ancoraggio con hrefattributi ... e nient'altro. Utilizza il principio della whitelisting, che @jaredcobb ha giustamente notato è il modo migliore per andare qui.


Non puoi dire ai tag strip quali tag sono ammessi? php.net/manual/en/function.strip-tags.php
redconservatory

Tuttavia, posso ancora vedere come wp_kses è meglio ora che posso vedere come elimina le classi indesiderate ...
redconservatory

Probabilmente non ho spiegato chiaramente ... Ma sì, wp_ksesconsente un maggiore controllo rispetto alle opzioni native di PHP. Penso di averlo detto. Ho usato anche la parola "attributi". Stavo dicendo che dipende dal tuo caso d'uso. Qualcuno che sta cercando di proteggere i propri dati da tutti i tag starebbe meglio usando strip_tags IMHO, ma è più delle mie preferenze di ogni altra cosa. Saluti.
Jared Cobb

7

Vorrei iniziare con lo stesso $allowedtagsarray che WordPress utilizza per i loro commenti. Puoi trovare il loro array nel [wordpress directory]/wp-includes/kses.phpfile. Mi sembrano impostazioni predefinite sensate e un buon punto di partenza. Ecco il loro array ...

$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(),
);

Non userei PHP strip_tagscome sostituto di wp_kses.

Non dovresti mai usare strip_tags per filtrare il contenuto di un utente sconosciuto!

Ho creato un breve video che spiega perché wp_kses () di WordPress è migliore di strip_tags () di PHP per sicurezza .


Ciao, che ne dici di & nbps
Latheesh VM Villa,

2

Ho usato solo wp_ksesquando ho specificamente bisogno di consentire / filtrare gli attributi dei tag HTML (ad esempio, voglio che possano avere un <image>tag, con un src=""attributo ma non voglio che siano in grado di ma href=""o style=""o qualsiasi altra cosa sul tag immagine. In tal caso, wp_ksesè utile perché (come puoi vedere nell'esempio che hai creato) puoi filtrare in modo molto specifico. Raramente ho usato wp_ksesperò perché trovo solo un paio di PHP nativo le funzioni (sotto) fanno il trucco e sono più facili da capire quando guardo il codice diversi mesi dopo.

Se vuoi rimuovere completamente i tag HTML (tranne forse consentirne alcuni), lo uso sempre strip_tags. Puoi passare una stringa di tag consentiti (come <p> <br> <strong>) o qualsiasi altro tag innocuo che ti piace. Ciò consente all'utente di avere un certo controllo sulla formattazione, se applicabile per il proprio caso d'uso. Mi piace strip_tagsperché adotta un approccio whitelist per la sanificazione dei dati. (Significa che tutto viene messo a nudo tranne ciò che si autorizza esplicitamente).

Se il tuo obiettivo è consentire loro di inserire qualsiasi contenuto HTML nel contenuto, ma vuoi solo mostrare il loro testo mentre lo inseriscono (come esempi di codice), quindi utilizza htmlspecialchars. In questo modo i caratteri HTML verranno convertiti nelle loro controparti codificate in modo da poterli inviare in sicurezza alla pagina.

Potresti imbatterti in un codice usando str_replacequale "cerca" tag cattivi o simili Non raccomando proprio questo approccio perché adotta un approccio di blacklist per la sanificazione dei dati e devi assicurarti costantemente che la tua blacklist sia aggiornata.

Immagino di riassumere, dipende da cosa sono usati i tuoi metabox. Se stai proteggendo dagli input degli utenti (che potrebbero essere dannosi), consiglierei strip_tagse consenti solo alcuni dei tag innocui. Se si dispone di un buon business case per davvero microgestire i tag e attributi specifici di contenuti dell'utente, use wp_kses.


Non wp_kses()fa tutto ciò che strip_tags()fa e altro? Sono tutto per mantenere le cose semplici, ma penso anche che ci sia un argomento per non "sorprendere" nessuno. wp_kses()è "il modo di Wordpress", e poiché stiamo scrivendo il codice di Wordpress, c'è un argomento che probabilmente è la scelta migliore. Inoltre, se ad un certo punto in futuro, vogliamo autorizzare determinate combinazioni di tag / attributi, l'utilizzo wp_kses()dall'inizio non richiede un refactor.
Rinogo,

2

Ecco qua Funziona sia in WordPress che all'esterno di 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;
    }
}

Buongiorno Sig. Svetoslav, questo è ancora sicuro? Ho cercato un modo semplice ma sicuro per disinfettare l'input dell'utente nel mio backoffice (no Wordpress). Voglio solo consentire l'uso della formattazione HTML di base come quelle presenti nel tuo codice, <b>, <I>, < u>. Pensi che posso usarlo come strip_tags ($ _ POST ['myDoc']) o pensi che dovrei fare qualcos'altro per essere sicuro? Grazie per l'aiuto!
Pluda,

Ciao, usa il mio codice. Controlla se viene eseguito nel contesto di WordPress utilizzerà la funzione WP, altrimenti eseguirà il fallback a php strip_tags. Inoltre è meglio usare $ _REQUEST anziché $ _POST perché ad un certo punto potresti passare i dati come parametro GET.
Svetoslav Marinov,

grazie per la risposta :-). Sto affrontando un problema ora ... se incolpo html formattato o ad esempio un codice dal testo sublime 3 manca la maggior parte del testo, ci deve essere un codice formattato nascosto che rompe lo script.
Pluda,

potrebbe essere un problema di codifica utf8
Svetoslav Marinov

Potrebbe essere, sto ripulendo html come ho scritto nella risposta sopra, cercando \ n, \ r e così via, ma il problema è ancora lì :-(. La pulizia dei dati incollati può essere un problema enorme, alcuni anni fa ho usato copia incolla per textedit per pulire le stringhe copiate, ma non posso aspettarmi che i miei utenti farebbero lo stesso.
Pluda


0

@Svetoslav Marinov

Ho aggiunto questo codice subito dopo $ 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);

per provare a pulire HTML e evitare che i caratteri nascosti incollati rompano il codice, ma non funziona, pulisce l'html, ma rimangono ancora i caratteri nascosti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.