web-dev-qa-db-fra.com

Échapper aux citations des attributs de shortcode

J'ai essayé de comprendre comment échapper aux guillemets (simples et doubles) des attributs de shortcode.

Fondamentalement, le contenu est écrit par l'utilisateur et peut donc potentiellement inclure des guillemets "et". Le problème, avec "guillemets, il empêche l'attribut shortcode de fonctionner, par exemple:

attibute = "du texte avec" guillemets "donc il arrête l'attribut ...."

Ainsi, au lieu d’obtenir la totalité de la chaîne, il s’arrête à la deuxième paire de guillemets.

Maintenant, je sais qu'il pourrait être possible de le configurer avec des guillemets simples, mais cela laisse le même problème si un utilisateur utilise des guillemets simples dans le texte.

J'ai examiné une variété de résolutions PHP/WP, mais je ne parviens pas à faire fonctionner l'une d'elles, par exemple esc_html, htmlspecialchars, htmlentities.

Peut-être que je me suis trompé ou que je n'utilise pas l'encodage au bon endroit.

C’est actuellement ce que j’utilise (sans encodage) comme shortcode (raccourci un peu)

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');

J'ai essayé d'ajouter après l'extrait tableau des choses comme

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

mais comme l'attribut est déjà cassé (print_r indique que la chaîne après que la citation est séparée en un élément de tableau pour chaque mot) échappant à la chaîne il ne fonctionne pas.

Essayé avant le tableau et cela ne fonctionne pas non plus je reçois un avis: Undefined index

Donc, pour clarifier, comment procédez-vous pour assainir l'entrée de l'utilisateur pour les données d'attribut de code court?

4
Apina

Il semble que vous travailliez du mauvais côté.

Essayez de nettoyer l'entrée utilisateur, par exemple à l'aide de sanitize_text_field , et non de la sortie de code court.

2
tfrommen

Il s'avère que le système de code court de WordPress utilise la fonction shortcode_parse_atts($text); pour analyser une entrée de code abrégé afin de récupérer les noms et les valeurs des attributs et de les stocker par paires dans le tableau $atts, qui est ensuite transmis à la fonction de code abrégé. Donc dans votre cas, ajouter des actions d'échappement dans la fonction shortcode comme ceci:

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

ne fonctionnera pas car shortcode_parse_atts() a déjà repris les noms et les valeurs des attributs et a peut-être mal interprété les guillemets dans les valeurs des attributs.

Pour regarder de plus près, la fonction shortcode_parse_atts() utilise ce motif regex:

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

reconnaître les noms et les valeurs des attributs dans les formats suivants:

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

Donc, si un utilisateur met des guillemets dans les valeurs, cela peut facilement mal tourner. Par exemple:

[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 )

Désinfecter après l'analyse est évidemment trop tard. Qu'en est-il de l'assainissement avant l'analyse? Nous devrons effacer toute l'entrée, car nous n'avons encore aucune valeur d'attribut sur laquelle travailler. Mais cela pose aussi des problèmes, par exemple:

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;
)

Le paradoxe est le suivant: afin de s’assurer que le moteur d’analyse s’analyse correctement, vous devez assainir les valeurs des attributs; mais pour cela, vous devez d'abord lancer le moteur d'analyse afin d'obtenir les valeurs.

En conclusion, je pense que le moyen raisonnable de s'assurer que tout va bien est de s'assurer que les attributs des utilisateurs sont entrés dans les formats appropriés. Une fois que les utilisateurs auront publié des attributs mal formatés, ce sera un gros casse-tête. Pour votre information, mon expérience est d’utiliser $content. Dans votre cas, je mettrais aps_person_description dans le $content, cela pourrait ressembler à ceci:

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

et les citations seront moins un problème.

6
samluthebrave

Vous pouvez vérifier esc_attr()

Encode les caractères <,>, &, "et '(inférieur à, supérieur à, esperluette, guillemet double et guillemet simple). Ne codera jamais les entités.

http://codex.wordpress.org/Function_Reference/esc_attr

1
birgire