Wp_kses $ típicos permitidos

9

Eu tenho uma caixa de texto de postagem personalizada que desejo limpar wp_ksesantes de atualizar minha meta meta de postagem.

Eu estava procurando exemplos de $allowedconfigurações comuns , mas só vi este exemplo:

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

O que é uma wp_kses $allowedconfiguração típica ? Alguém pode fornecer um exemplo do que eles normalmente filtram?

conservatório
fonte
Esta questão está fora do escopo do site, pois há mais de uma resposta correta. Se você restringir o escopo da pergunta, apresente um caso de uso e peça a alguém que forneça as coisas que você deve incluir que seriam muito melhores.
mor7ifer
Quero ter uma caixa de texto rico onde o usuário pode simplesmente digitar o texto regular, negrito, links, itálico ...
redconservatory

Respostas:

8

Eu discordo da solução postada por @JaredCobb, wp_kses()é muito mais flexível do que o método que ele apresentou. Ele pode remover atributos indesejados das tags sem destruir as próprias tags. Por exemplo, se o usuário digitar <strong class='foo'>, wp_kses()retornará <strong>se você não permitir a classe, enquanto strip_tags()removeria <strong>completamente.

@redconservatory: os atributos que você deseja usar são os seguintes:

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

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

Isso permitirá negrito e itálico sem atributos, além de tags de âncora com hrefatributos ... e nada mais. Ele usa o princípio da lista de permissões, que o @jaredcobb observou com razão é o melhor caminho a percorrer aqui.

mor7ifer
fonte
Você não pode dizer às tags de tira que tags são permitidas? php.net/manual/en/function.strip-tags.php
redconservatory
Embora, eu ainda posso ver como wp_kses é melhor agora que eu posso ver como ele retira as classes indesejados ...
redconservatory
Provavelmente não expliquei claramente ... Mas sim, wp_ksespermite mais controle do que as opções nativas do PHP. Eu acho que disse isso. Eu usei a palavra "atributos" também. Eu estava dizendo que depende do seu caso de uso. Alguém tentando proteger seus dados de todas as tags seria melhor usar strip_tags IMHO, mas é mais da minha preferência do que qualquer outra coisa. Felicidades.
21412 Jared Cobb
7

Eu começaria com a mesma $allowedtagsmatriz que o WordPress usa para seus comentários. Você pode encontrar sua matriz no [wordpress directory]/wp-includes/kses.phparquivo. Esses parecem padrões sensatos para mim e um bom ponto de partida. Aqui está sua 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(),
);

Eu não usaria PHP strip_tagscomo um substituto para wp_kses.

Você nunca deve usar strip_tags para filtrar o conteúdo de um usuário desconhecido!

Eu criei um vídeo rápido explicando Por que o wp_kses () do WordPress é melhor que o strip_tags () do PHP, por segurança .

mikemick
fonte
Olá, o que dizer & nbps
Latheesh VM Villa
2

Só usei wp_ksesquando precisei especificamente permitir / filtrar atributos de tags HTML (por exemplo, quero que eles tenham uma <image>tag, com um src=""atributo, mas não quero que eles possam mas href=""ou style=""ou qualquer outra coisa na tag da imagem.Nesse caso, wp_ksesé útil porque (como você pode ver no exemplo que você criou) você pode filtrar de forma muito específica.Eu raramente usei isso wp_ksesporque acho que apenas um par de PHP nativo As funções (abaixo) fazem o truque e são mais fáceis de entender quando eu olho o código vários meses depois.

Se você deseja remover completamente as tags HTML (exceto talvez permitir algumas), eu sempre uso strip_tags. Você pode passar uma série de tags permitidas (como <p> <br> <strong>) ou qualquer outra tag inofensiva que desejar. Isso permite que o usuário possa ter algum controle sobre a formatação, se aplicável ao seu caso de uso. Gosto strip_tagsporque é preciso uma abordagem da lista de desbloqueio para limpar seus dados. (Isso significa que tudo é retirado, exceto o que você coloca na lista de permissões explicitamente).

Se seu objetivo é permitir que eles coloquem HTML no conteúdo, mas você só deseja mostrar o texto deles conforme eles entraram (como exemplos de código), use htmlspecialchars. Isso converterá caracteres HTML em seus equivalentes codificados para que você possa imprimi-lo com segurança na página.

Você pode se deparar com um código usando o str_replacequal "procura" marcas ruins como ou o que quer que seja. Eu realmente não recomendo essa abordagem, porque ela usa uma abordagem de lista negra para desinfetar dados e você precisa constantemente garantir que sua lista negra esteja atualizada.

Acho que, para resumir, depende do uso dos seus metaboxes. Se você estiver protegendo contra a entrada de usuários (que podem ser maliciosos), recomendo strip_tagse permita apenas algumas das tags inofensivas. Se você tem um bom caso de negócios para realmente gerenciar as tags e atributos específicos do conteúdo do usuário use wp_kses,.

Jared Cobb
fonte
Não wp_kses()faz tudo o que strip_tags()faz e muito mais? Sou a favor de manter as coisas simples, mas também acho que há um argumento para não "surpreender" ninguém. wp_kses()é "o caminho do Wordpress" e, como estamos escrevendo o código do Wordpress, há um argumento de que provavelmente é a melhor escolha. Além disso, se em algum momento no futuro, quisermos colocar na lista de permissões determinadas combinações de tags / atributos, usar wp_kses()desde o início não exige refatoração.
Rinogo 15/08/19
2

Ai está. Isso funciona tanto no WordPress como fora dele.

<?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
fonte
Olá, Sr. Svetoslav, ainda hoje é seguro? Estou procurando uma maneira simples e segura de higienizar a entrada do usuário no meu backoffice (sem Wordpress). Eu só quero permitir o uso de formatação básica de html, como as que estão presentes no seu código, <b>, <I>, < u>. Você acha que posso usar isso como strip_tags ($ _ POST ['myDoc']) ou acha que devo fazer mais alguma coisa para estar seguro? Obrigado pela ajuda!
Pluda
Olá, use meu código. Ele verifica se foi executado no contexto do WordPress, usando a função WP, caso contrário, fará o fallback para php strip_tags. Também é melhor usar $ _REQUEST do que $ _POST, porque em algum momento você pode passar dados como um parâmetro GET.
Svetoslav Marinov
Obrigado pela resposta :-). Estou enfrentando um problema agora ... se eu colar html formatado ou, por exemplo, algum código do texto sublime 3, a maior parte do texto estiver ausente, deve haver algum código formatado oculto quebrando o script.
Pluda
poderia ser um problema de codificação UTF8
Svetoslav Marinov
Pode ser que eu esteja limpando o html conforme postado na resposta acima, procurando por \ n, \ re etc., mas o problema ainda está lá :-(. A limpeza de dados colados pode ser um grande problema, alguns anos atrás eu usei copiar colar para editar o texto para limpar as seqüências de caracteres copiadas, mas não posso esperar que meus usuários façam o mesmo.
Pluda
0

@Svetoslav Marinov

Eu adicionei esse código logo apó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);

para tentar limpar o html e evitar que os caracteres ocultos colados quebrem o código, mas não funciona, ele limpa o html, mas os caracteres ocultos ainda permanecem.

Pluda
fonte