Escapando aspas dos atributos shortcode

3

Eu tenho tentado descobrir como escapar de aspas (simples e dupla) dos atributos shortcode.

Basicamente, o conteúdo é escrito pelo usuário e, portanto, pode potencialmente incluir "e 'aspas. Problema sendo, com" aspas ele está impedindo o atributo shortcode de funcionar, por exemplo:

attibute="algum texto aqui com" aspas "então ele pára o atributo ...."

Então, em vez de obter a string inteira, ela é interrompida no segundo par de citações.

Agora, sei que é possível configurá-lo com aspas simples, mas isso deixa a mesma situação se um usuário usar aspas simples no texto.

Eu olhei para uma variedade de resoluções PHP / WP, mas eu não consigo fazer com que nenhum deles funcione, por exemplo, esc_html, htmlspecialchars, htmlentities.

Talvez eu tenha configurado errado ou não esteja acionando a codificação no lugar certo.

Este é atualmente o que eu estou usando (sem codificação) como o shortcode (encurtado um pouco)

function aps_person_schema_shortcode( $atts, $content = null)   {

extract( shortcode_atts( array(     
            'aps_person_description' => ''
        ), $atts
    )
);

$aps_person_return = '<div class="aps_person_container aps_container">';
$aps_person_return .= '<p class="aps_person_description" itemprop="description">' . $aps_person_description . '</p>';
$aps_person_return .= '</div>';

return $aps_person_return;

}
add_shortcode('aps_person', 'aps_person_schema_shortcode');

Eu tentei adicionar após o array de extração coisas como

$aps_person_description = esc_html($atts['aps_person_description']); 

mas como o atributo já está quebrado (print_r exibe que a string após a citação é separada em um item da matriz para cada palavra) escapar da string não funciona.

Tentei antes da matriz e não funciona ou recebo um aviso: Índice indefinido

Então, para esclarecer, como você vai sanitizar a entrada do usuário para os dados do atributo shortcode?

    
por Apina 08.03.2013 / 16:18

3 respostas

2

Parece que você está trabalhando no lado errado.

Tente sanear a entrada do usuário, por exemplo, por meio de sanitize_text_field , não da saída de shortcode.

    
por tfrommen 08.03.2013 / 16:25
6

Acontece que o sistema de shortcode do WordPress usa a função shortcode_parse_atts($text); para analisar uma entrada de shortcode para recuperar os nomes e valores dos atributos e armazená-los em pares na matriz $atts , que é passada para a função shortcode. Então, no seu caso, adicionando ações de escape na função shortcode assim:

$aps_person_description = esc_html($atts['aps_person_description']); 

não funcionará porque shortcode_parse_atts() já recuperou os nomes e valores dos atributos e pode ter interpretado incorretamente as cotações nos valores dos atributos.

Para olhar mais de perto, a função shortcode_parse_atts() usa esse padrão de expressão regular:

/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/

para reconhecer os nomes e valores dos atributos nos formatos abaixo:

1. attr1="value1"
2. attr2='value2'
3. attr3=value3
4. "value4"
5. value5

Portanto, se um usuário colocar aspas em valores, isso pode facilmente dar errado. Por exemplo:

[my_shortcode dog='Santa's Little Helper' /]    
// $attr is Array ( [0] => dog='Santa's [1] => Little [2] => Helper' )
// should be Array ( [dog] => Santa's Little Helper )

Sanitizing após a análise é, obviamente, muito tarde, o que dizer de saneantes antes da análise? Teremos que higienizar toda a entrada, pois não temos valores de atributos para trabalhar ainda. Mas isso também causa problemas, por exemplo:

html_entities("[my_shortcode dog='Santa's Little Helper' /]", ENT_QUOTES);
// now entry is [my_shortcode dog=&#039;Santa&#039;s Little Helper&#039; /]
// after parsing: 
Array
(
    [dog] => &#039;Santa&#039;s
    [0] => Little
    [1] => Helper&#039;
)

O paradoxo é: para garantir que o mecanismo de análise seja analisado corretamente, você precisa limpar os valores dos atributos; mas para fazer isso você tem que executar o mecanismo de análise primeiro para obter os valores.

Concluindo, acho que a maneira razoável de garantir que tudo corra bem é garantir que os usuários insiram atributos em formatos adequados, uma vez que os usuários postaram atributos mal formatados, será uma grande dor de cabeça. FYI, minha experiência é fazer uso de $content . No seu caso, eu colocaria aps_person_description no $content , pode ser assim:

[my_shortcode]some text here with "quotes" so it stops the attribute....[/my_shortcode]

e as cotações serão menos um problema.

    
por samluthebrave 28.07.2013 / 05:09
1

Você pode conferir esc_attr()

  

Codifica o & lt ;, & gt ;, & amp ;, "e '(menor que, maior que, e comercial,   aspas duplas e aspas simples). Nunca dobrará a codificação   entidades.

enlace

    
por birgire 08.03.2013 / 16:25