web-dev-qa-db-fra.com

Wp_kses $ autorisés

J'ai une zone de texte personnalisée que je souhaite désinfecter à l'aide de wp_kses avant de mettre à jour ma méta de publication.

Je cherchais des exemples de paramètres $allowed courants, mais je n'ai vu que cet exemple:

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

Qu'est-ce qu'un paramètre wp_kses$allowed typique? Quelqu'un peut-il donner un exemple de ce qu'ils filtrent normalement?

8
redconservatory

Je ne suis pas d’accord avec la solution publiée par @JaredCobb, wp_kses() est beaucoup plus souple que la méthode qu’il a présentée. Il peut éliminer les attributs indésirables des étiquettes sans les détruire. Par exemple, si l'utilisateur entre <strong class='foo'>, wp_kses() renverra <strong> si vous n'autorisiez pas la classe, alors que strip_tags() supprimera le <strong> complètement.

@redconservatory: Les attributs que vous souhaitez utiliser sont les suivants:

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

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

Cela autorisera les caractères gras et italiques sans attributs, ainsi que les balises d'ancrage avec un attribut href ... et rien d'autre. Il utilise le principe de la liste blanche, ce que @jaredcobb a noté, à juste titre, comme la meilleure voie à suivre.

6
mor7ifer

Je commencerais avec le même tableau $allowedtags que WordPress utilise pour leurs commentaires. Vous pouvez trouver leur tableau dans le fichier [wordpress directory]/wp-includes/kses.php. Celles-ci me paraissent être des défauts raisonnables et un bon point de départ. Voici leur tableau ...

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

Je voudraisPASutiliser le strip_tags de PHP en remplacement de wp_kses.

Vous ne devriez jamais utiliser strip_tags pour filtrer le contenu d'un utilisateur inconnu!

J’ai créé une vidéo expliquant Pourquoi wp_kses () de WordPress est meilleur que le strip_tags () de PHP pour la sécurité .

6
mikemick

Voilà. Cela fonctionne à la fois dans WordPress et en dehors de 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;
    }
}
2
Svetoslav Marinov

Je n'ai utilisé wp_kses que lorsque j'ai spécifiquement besoin d'autoriser/filter attributs des balises HTML (par exemple, je veux qu'ils soient autorisés à avoir une balise <image>, avec un attribut src="" mais I ne pas je veux qu'ils puissent utiliser mais href="" ou style="" ou quoi que ce soit d'autre sur la balise d'image. Dans ce cas, wp_kses est pratique car (comme vous pouvez le voir dans l'exemple que vous avez créé), vous pouvez filtrer très bas Cependant, j’ai rarement utilisé wp_kses, car j’ai trouvé que quelques fonctions PHP natives (ci-dessous) permettent de résoudre ce problème et sont plus faciles à comprendre lorsque je regarde le code plusieurs mois plus tard.

Si vous voulez supprimer complètement les balises HTML (sauf peut-être permettre quelques-unes), j'utilise toujours strip_tags . Vous pouvez transmettre une chaîne de balises autorisées (comme <p> <br> <strong>) ou toute autre balise sans danger que vous aimez. Cela permet à l'utilisateur de pouvoir contrôler certains sur le formatage, si cela s'applique à votre cas d'utilisation. J'aime strip_tags car il faut une liste blanche pour nettoyer vos données. (Cela signifie que tout est supprimé sauf ce que vous avez explicitement inscrit dans la liste blanche).

Si votre objectif est de leur permettre d'insérer du code HTML dans le contenu, mais que vous souhaitez simplement afficher leur texte tel qu'il l'a saisi (comme des exemples de code), utilisez htmlspecialchars . Cela convertira les caractères HTML en leurs équivalents codés afin que vous puissiez les exporter en toute sécurité sur la page.

Vous pourriez rencontrer du code en utilisant str_replace qui "recherche" les mauvaises étiquettes telles que ou autres. Je ne recommande vraiment pas cette approche, car elle nécessite une approche de {liste noire} _ pour la désinfection des données et vous devez vous assurer en permanence que votre liste noire est à jour.

Je suppose que pour résumer, cela dépend de l’utilisation de vos métaboxes. Si vous protégez contre les entrées d'utilisateurs (qui pourraient être malveillants), je recommande strip_tags et n'autorise que certaines balises inoffensives. Si vous avez une bonne analyse de rentabilisation pour vraiment gérer les balises et les attributs spécifiques du contenu de l'utilisateur, use wp_kses.

2
Jared Cobb

Vous pouvez également utiliser la fonction wp_kses_post qui est utilisée pour le contenu de publication et qui nécessite uniquement des données en tant que paramètre.

Plus d'infos ici: http://codex.wordpress.org/Function_Reference/wp_kses_post

1
OriginalEXE

@Svetoslav Marinov

J'ai ajouté ce code juste après $ 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);

pour essayer de nettoyer le code HTML et d’éviter le code de rupture des caractères masqués collés, mais cela ne fonctionne pas, il nettoie le code HTML, mais des caractères masqués subsistent.

0
Pluda