Comment éviter de s'échapper lors de l'enregistrement du code HTML dans une valeur d'option?


9

J'ai une page Options de thème où l'utilisateur peut ajouter certaines options comme les liens Facebook, etc. L'une des options est pour un code d'annonce et lors de l'enregistrement en tant qu'option, il s'échappe encore et encore.

Quelle est la meilleure approche pour enregistrer le code inséré dans une page d'administration à l' <textarea>aide update_option( 'sidebar_code', $_POST['sidebar_code'] );?

Réponses:


8
stripslashes(wp_filter_post_kses(addslashes($_POST['sidebar_code'])));

mais vous devez savoir que le filtre kses n'est pas sûr à 100%.


2
que voulez-vous dire par non sûr à 100%?
Amit le

Je veux dire que quelqu'un pourrait encore XSS votre site s'il est vraiment bon dans ce domaine. Si je ne me trompe pas, le dernier correctif wp a corrigé une vulnérabilité xss dans les fonctions
kses

kses supprime tous les attributs de classe et html supplémentaires (par exemple class = "classname" width = "100") existe-t-il un moyen de contourner cela?
Talon

11

J'ai pris une autre approche à ce sujet. J'ai encodé et décodé mes options avec des entités HTML. Une chose dont je ne suis pas sûr est de savoir si cela ouvre une porte dérobée méchante pour que les gens conduisent à compromettre le HTML. Je compte sur le fait que seuls les administrateurs modifieront les options de thème de toute façon, mais peut-être que je suis naïf?

Voici à quoi cela ressemble lorsque j'enregistre une option:

update_option('my_option', htmlentities(stripslashes($_REQUEST['my_option'])));

Et voici à quoi ça ressemble quand je récupère une option:

html_entity_decode(get_option('my_option',htmlentities($my_default_value)));

2

Ce n'est pas une réponse complète à votre question, mais peut-être vous orientant dans la bonne direction: vous pouvez essayer <?php esc_textarea( $text ) ?>, comme détaillé par le codex ici: http://codex.wordpress.org/Function_Reference/esc_textarea .

Mes propres extraits de zone de texte metabox ressemblent à ceci:

<?php 
  if ( $meta_box['type'] == "textarea" ) {
    $meta_box_value = esc_textarea( get_post_meta($post->ID, $meta_box['name'].'_value', true) );
    echo '<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="' . $meta_box['name'] . '_value">' . $meta_box_value . '</textarea><br />';
  }
?>

Cela dépend de ce que vous faites. esc_textarea convertira tout code HTML en code d'entités HTML, vous ne pouvez donc pas l'utiliser avec une zone de texte riche comme tinyMCE.
Jake
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.