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?
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.
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
.
J’ai créé une vidéo expliquant Pourquoi wp_kses () de WordPress est meilleur que le strip_tags () de PHP pour la sécurité .
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;
}
}
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
.
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
@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.