Wp_kses $ typique autorisé

9

J'ai une zone de texte de publication personnalisée que je souhaite assainir wp_ksesavant de mettre à jour ma méta de publication.

Je cherchais des exemples de $allowedparamètres communs , 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 wp_kses $allowedcadre typique ? Quelqu'un peut-il fournir un exemple de ce pour quoi il filtre normalement?

rouge conservatoire
la source
Cette question est hors de portée pour le site car il existe plusieurs réponses correctes. Si vous réduisez la portée de la question, présentez un cas d'utilisation et demandez à quelqu'un de vous fournir des éléments que vous devriez inclure, ce serait beaucoup mieux.
mor7ifer
Je veux avoir une zone de texte riche où l'utilisateur peut simplement entrer du texte normal, gras, liens, italiques ...
redconservatory

Réponses:

8

Je ne serais pas d'accord avec la solution proposée par @JaredCobb, qui wp_kses()est beaucoup plus flexible que la méthode qu'il a présentée. Il peut supprimer les attributs indésirables des balises sans détruire les balises elles-mêmes. Par exemple, si l'utilisateur insère <strong class='foo'>, wp_kses()retournera <strong>si vous n'autorisez pas la classe, tandis strip_tags()que supprimera <strong>complètement.

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

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

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

Cela permettra le gras et l'italique sans attribut, ainsi que les balises d'ancrage avec un hrefattribut ... et rien d'autre. Il utilise le principe de la liste blanche, que @jaredcobb a noté à juste titre comme la meilleure façon d'aller ici.

mor7ifer
la source
Vous ne pouvez pas dire aux balises strip quelles balises sont autorisées? php.net/manual/en/function.strip-tags.php
redconservatory
Bien que je puisse encore voir comment wp_kses est meilleur maintenant que je peux voir comment il supprime les classes indésirables ...
redconservatory
Je n'ai probablement pas expliqué clairement ... Mais oui, wp_ksespermet plus de contrôle que les options PHP natives. Je pense que je l'ai dit. J'ai également utilisé le mot «attributs». Je disais que cela dépend de votre cas d'utilisation. Quelqu'un qui essaie de protéger leurs données de toutes les balises serait mieux d'utiliser strip_tags à mon humble avis, mais c'est plus ma préférence qu'autre chose. À votre santé.
Jared Cobb
7

Je commencerais avec le même $allowedtagstableau que WordPress utilise pour leurs commentaires. Vous pouvez trouver leur tableau dans le [wordpress directory]/wp-includes/kses.phpfichier. Celles-ci me semblent des valeurs par défaut 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 n'utiliserais PAS PHP strip_tagsen remplacement de wp_kses.

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

J'ai créé une vidéo rapide expliquant pourquoi wp_kses () de WordPress est meilleur que strip_tags () de PHP pour la sécurité .

mikemick
la source
Bonjour et nbps
Latheesh VM Villa
2

Je n'ai utilisé que wp_kseslorsque j'avais spécifiquement besoin d'autoriser / filtrer les attributs des balises HTML (par exemple, je veux qu'ils soient autorisés à avoir une <image>balise, avec un src=""attribut, mais je ne veux pas qu'ils puissent, mais href=""ou style=""ou quoi que ce soit d'autre sur la balise image. Dans ce cas, wp_ksesest pratique parce que (comme vous pouvez le voir dans l'exemple que vous avez créé), vous pouvez filtrer très spécifiquement. Je l'ai rarement utilisé wp_ksescar je trouve que quelques PHP natifs Les fonctions (ci-dessous) font l'affaire et sont plus faciles à comprendre lorsque je regarde le code plusieurs mois plus tard.

Si vous souhaitez supprimer complètement les balises HTML (sauf peut-être en autoriser quelques-unes), j'utilise toujours strip_tags. Vous pouvez passer une chaîne de balises autorisées (comme <p> <br> <strong>) ou toute autre balise inoffensive que vous aimez. Cela permet à l'utilisateur d'avoir un certain contrôle sur la mise en forme, si cela s'applique à votre cas d'utilisation. J'aime strip_tagsparce qu'il faut une approche de liste blanche pour nettoyer vos données. (Cela signifie que tout est supprimé, sauf ce que vous avez explicitement ajouté à la liste blanche).

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

Vous pourriez rencontrer du code str_replacequi "recherche" de mauvaises balises comme ou ou autre. Je ne recommande vraiment pas cette approche, car il faut une approche de liste noire pour nettoyer les données et vous devez constamment vous assurer que votre liste noire est à jour.

Je suppose que pour résumer, cela dépend de l'utilisation de vos métaboxes. Si vous vous protégez contre les commentaires d'utilisateurs (qui pourraient être malveillants), je recommanderais strip_tagset autoriserais simplement certaines des balises inoffensives. Si vous avez un bon business case pour microgestion vraiment les balises et les attributs spécifiques du contenu de l'utilisateur, use wp_kses.

Jared Cobb
la source
Ne fait pas wp_kses()tout ce qui strip_tags()fait et plus encore? Je suis tout pour garder les choses simples, mais je pense aussi qu'il y a un argument pour ne "surprendre" personne. wp_kses()est "la manière Wordpress", et puisque nous écrivons du code Wordpress, il y a un argument que c'est probablement le meilleur choix. De plus, si à un moment donné dans le futur, nous voulons ajouter à la liste blanche certaines combinaisons de balises / attributs, l'utilisation wp_kses()depuis le début ne nécessite pas de refactorisation.
rinogo
2

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;
    }
}
Svetoslav Marinov
la source
Bonjour, M. Svetoslav, est-ce encore sûr en ce moment? Je cherchais un moyen simple mais sûr de filtrer les entrées des utilisateurs dans mon backoffice (pas Wordpress). Je veux juste autoriser l'utilisation d'un formatage HTML de base tels que ceux présents dans votre code, <b>, <I>, < u>. Pensez-vous que je peux l'utiliser comme strip_tags ($ _ POST ['myDoc']) ou pensez-vous que je devrais faire autre chose pour être sûr? Merci pour l'aide!
Pluda
Salut, utilise mon code. Il vérifie s'il est exécuté dans le contexte WordPress utilisera la fonction WP, sinon reviendra à php strip_tags. Il est également préférable d'utiliser $ _REQUEST plutôt que $ _POST car à un moment donné, vous pouvez transmettre des données en tant que paramètre GET.
Svetoslav Marinov
Merci pour votre réponse :-). Je me bats avec un problème maintenant ... si je colle du HTML formaté ou par exemple du code de texte sublime 3 la plupart du texte est manquant, il doit y avoir du code formaté caché cassant le script.
Pluda
pourrait être un problème d'encodage utf8
Svetoslav Marinov
Il se peut que je nettoie le HTML comme je l'ai indiqué dans la réponse ci-dessus, en recherchant \ n, \ r et ainsi de suite, mais le problème est toujours là :-(. Le nettoyage des données collées peut être un énorme problème, certains il y a des années, j'ai utilisé le copier-coller pour textedit pour nettoyer les chaînes copiées, mais je ne peux pas m'attendre à ce que mes utilisateurs fassent de même
Pluda
0

@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 html et éviter que les caractères cachés collés ne cassent le code, mais cela ne fonctionne pas, il nettoie le html, mais les caractères cachés restent.

Pluda
la source