Típico wp_kses $ permitido

9

Tengo un cuadro de texto de publicación personalizado que quiero usar wp_ksesantes de actualizar mi meta de publicación.

Estaba buscando ejemplos de $allowedconfiguraciones comunes , pero solo he visto este ejemplo:

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

¿Qué es un wp_kses $allowedentorno típico ? ¿Puede alguien dar un ejemplo de lo que normalmente filtran?

conservador rojo
fuente
Esta pregunta está fuera del alcance del sitio ya que hay más de una respuesta correcta. Si reduce el alcance de la pregunta, presente un caso de uso y solicite a alguien que le proporcione cosas que debería incluir que serían mucho mejores.
mor7ifer
Quiero tener un cuadro de texto enriquecido donde el usuario pueda ingresar texto normal, negrita, enlaces, cursiva ...
redconservatory

Respuestas:

8

No estaría de acuerdo con la solución publicada por @JaredCobb, wp_kses()es mucho más flexible que el método que presentó. Puede eliminar los atributos no deseados de las etiquetas sin destruir las etiquetas mismas. Por ejemplo, si el usuario ingresa <strong class='foo'>, wp_kses()regresaría <strong>si no permitiera la clase, mientras strip_tags()que la eliminaría por <strong>completo.

@redconservatory: los atributos que querrás usar son los siguientes:

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

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

Esto permitirá negrita y cursiva sin atributos, así como etiquetas de anclaje con hrefatributos ... y nada más. Utiliza el principio de la lista blanca, que @jaredcobb señaló correctamente es la mejor manera de ir aquí.

mor7ifer
fuente
¿No puedes decirle a las etiquetas de tira qué etiquetas están permitidas? php.net/manual/en/function.strip-tags.php
redconservatory
Aunque, todavía puedo ver cómo wp_kses es mejor ahora que puedo ver cómo elimina las clases no deseadas ...
Redconservatory
Probablemente no lo expliqué claramente ... Pero sí, wp_ksespermite más control que las opciones nativas de PHP. Creo que dije eso. También usé la palabra "atributos". Estaba diciendo que depende de su caso de uso. Alguien que intente proteger sus datos de todas las etiquetas estaría mejor usando strip_tags en mi humilde opinión, pero es más de mi preferencia que cualquier otra cosa. Salud.
Jared Cobb
7

Comenzaría con la misma $allowedtagsmatriz que WordPress usa para sus comentarios. Puede encontrar su matriz en el [wordpress directory]/wp-includes/kses.phparchivo. Estos me parecen valores predeterminados razonables y un buen punto de partida. Aquí está su matriz ...

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

Yo NO utilizar PHP strip_tagscomo un reemplazo para wp_kses.

¡Nunca debe usar strip_tags para filtrar el contenido de un usuario desconocido!

He creado un video rápido que explica por qué WordPress 'wp_kses () es mejor que PHP's strip_tags () por seguridad .

mikemick
fuente
Hola, ¿qué pasa & nbps
Latheesh VM Villa
2

Solo lo he usado wp_ksescuando específicamente he necesitado permitir / filtrar atributos de etiquetas HTML (por ejemplo, quiero que se les permita tener una <image>etiqueta, con un src=""atributo pero no quiero que puedan pero href=""o style=""o cualquier otra cosa en la etiqueta de la imagen. En ese caso, wp_kseses útil porque (como puede ver en el ejemplo que creó) puede filtrar muy específicamente. Raramente lo he usado wp_ksesporque solo encuentro un par de PHP nativos Las funciones (a continuación) hacen el truco y son más fáciles de entender cuando miro el código varios meses después.

Si desea eliminar completamente las etiquetas HTML (excepto quizás permitir algunas), entonces siempre las uso strip_tags. Puede pasar una cadena de etiquetas permitidas (como <p> <br> <strong>) o cualquier otra etiqueta inofensiva que desee. Esto permite al usuario tener cierto control sobre el formateo, si eso es aplicable para su caso de uso. Me gusta strip_tagsporque se necesita un enfoque de lista blanca para desinfectar sus datos. (Lo que significa que todo se elimina, excepto lo que explícitamente incluye en la lista blanca).

Si su objetivo es permitirles poner cualquier HTML en el contenido, pero solo desea mostrar su texto tal como lo ingresaron (como ejemplos de código), use htmlspecialchars. Esto convertirá los caracteres HTML en sus equivalentes codificados para que pueda enviarlos a la página de forma segura.

Es posible que encuentre un código str_replaceque "busca" etiquetas malas como o lo que sea. Realmente no recomiendo ese enfoque porque toma un enfoque de lista negra para desinfectar los datos y debe asegurarse constantemente de que su lista negra esté actualizada.

Para resumir, depende de para qué se usen tus metaboxes. Si está protegiendo contra la entrada de usuarios (que podrían ser maliciosos), recomendaría strip_tagsy permitiría algunas de las etiquetas inofensivas. Si usted tiene un caso muy buen negocio para microgestión las etiquetas y los atributos específicos de contenido del usuario, use wp_kses.

Jared Cobb
fuente
¿No wp_kses()hace todo lo que strip_tags()hace y más? Estoy a favor de mantener las cosas simples, pero también creo que hay un argumento para no "sorprender" a nadie. wp_kses()es "la forma de Wordpress", y dado que estamos escribiendo código de Wordpress, existe el argumento de que probablemente sea la mejor opción. Además, si en algún momento en el futuro, queremos incluir en la lista blanca ciertas combinaciones de etiquetas / atributos, el uso wp_kses()desde el principio no requiere un refactorizador.
rinogo
2

Ahí tienes. Esto funciona tanto en WordPress como fuera 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
fuente
Hola, señor Svetoslav, ¿es seguro en estos días? He estado buscando una forma simple pero segura de desinfectar la entrada del usuario en mi backoffice (no Wordpress). Solo quiero permitir el uso de formato html básico como los presentes en su código, <b>, <I>, < u>. ¿Crees que puedo usar esto como strip_tags ($ _ POST ['myDoc']) o crees que debería hacer algo más para estar seguro? ¡Gracias por la ayuda!
Pluda
Hola, usa mi código. Comprueba si se ejecuta dentro del contexto de WordPress, usará la función WP; de lo contrario, recurrirá a php strip_tags. También es mejor usar $ _REQUEST en lugar de $ _POST porque en algún momento puede pasar datos como un parámetro GET.
Svetoslav Marinov
gracias por responder :-). Estoy luchando con un problema ahora ... si pego html formateado o, por ejemplo, falta algo de código del texto sublime 3, falta la mayor parte del texto, debe haber algún código oculto formateado que rompa el script.
Pluda
podría ser un problema de codificación utf8
Svetoslav Marinov
Puede ser, estoy limpiando html como publiqué en la respuesta anterior, buscando \ n, \ r, etc., pero el problema sigue ahí :-(. La limpieza de datos pegados puede ser un gran problema, algunos Hace años usé copiar y pegar para enviar mensajes de texto para limpiar las cadenas copiadas, pero no puedo esperar que mis usuarios hagan lo mismo.
Pluda
0

@Svetoslav Marinov

He agregado este código justo después de $ 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);

para tratar de limpiar html y evitar que los caracteres ocultos pegados rompan el código, pero no funciona, limpia el html, pero los caracteres ocultos aún permanecen.

Pluda
fuente