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

Amit
la source

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%.

onetrickpony
la source
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)));

la source
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 />';
  }
?>
gillespieza
la source
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