Como evitar o escape ao salvar código HTML em um valor de opção?

9

Eu tenho uma página Opções de tema, na qual o usuário pode adicionar determinadas opções, como links do Facebook, etc. Uma das opções é para algum código de anúncio e, ao salvá-lo como opção, ele é escapado repetidamente.

Qual é a melhor abordagem para salvar código inserido em uma página de administrador <textarea>usando update_option( 'sidebar_code', $_POST['sidebar_code'] );?

Amit
fonte

Respostas:

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

mas você deve saber que o filtro kses não é 100% seguro.

onetrickpony
fonte
2
o que você quer dizer com não é 100% seguro?
Amit
Quero dizer que alguém ainda pode usar o XSS no seu site se for realmente bom nisso. Se não me engano o último patch de wp consertou uma vulnerabilidade de XSS nas funções KSES
onetrickpony
O kses retira todos os atributos extras de classe e html (por exemplo: class = "classname" width = "100") existe alguma maneira de contornar isso?
Talon
11

Eu tomei outra abordagem para isso. Codifiquei e decodifiquei minhas opções com entidades HTML. Uma coisa de que não tenho certeza é se isso abre uma porta desagradável para as pessoas conduzirem o HTML comprometido. Estou confiando no fato de que apenas os administradores editarão as opções de tema de qualquer maneira, mas talvez eu esteja sendo ingênuo?

Aqui está o que parece quando eu salvo uma opção:

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

E é isso que parece quando eu recupero uma opção:

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

fonte
2

Esta não é uma resposta completa à sua pergunta, mas possivelmente está apontando na direção certa: você pode tentar <?php esc_textarea( $text ) ?>, conforme detalhado no códice aqui: http://codex.wordpress.org/Function_Reference/esc_textarea .

Meus próprios trechos de metabar textarea são assim:

<?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
fonte
Depende do que você está fazendo. esc_textarea converterá qualquer html em códigos de entidades HTML, portanto você não poderá usá-lo com uma área de richtext como tinyMCE.
Jake