¿Cómo evitar el escape al guardar el código HTML en un valor de opción?

9

Tengo una página de Opciones de tema donde el usuario puede agregar ciertas opciones, como enlaces de Facebook, etc. Una de las opciones es para algunos códigos de anuncios y, al guardarlos como una opción, se escapa una y otra vez.

¿Cuál es el mejor enfoque para guardar el código insertado en una página de administración <textarea>usando update_option( 'sidebar_code', $_POST['sidebar_code'] );?

Amit
fuente

Respuestas:

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

pero debes saber que el filtro kses no es 100% seguro.

Pony de un solo truco
fuente
2
¿Qué quieres decir con no 100% seguro?
Amit
Me refiero a que alguien aún podría enviar XSS a su sitio si es realmente bueno en eso. Si no me equivoco, el último parche de wp solucionó una vulnerabilidad xss en las funciones
kses
kses elimina todos los atributos adicionales de clase y html (por ejemplo, class = "classname" width = "100") ¿hay alguna forma de evitar eso?
Talon
11

Tomé otro enfoque para esto. Codifiqué y decodifiqué mis opciones con entidades HTML. Una cosa de la que no estoy seguro es si esto abre una puerta trasera desagradable para que la gente maneje HTML comprometedor. Confío en el hecho de que solo los administradores editarán las opciones de tema de todos modos, pero ¿tal vez estoy siendo ingenuo?

Así es como se ve cuando guardo una opción:

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

Y así es como se ve cuando recupero una opción:

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

fuente
2

Esta no es una respuesta completa a su pregunta, pero posiblemente lo apunte en la dirección correcta: podría intentar <?php esc_textarea( $text ) ?>, como se detalla en el códice aquí: http://codex.wordpress.org/Function_Reference/esc_textarea .

Mis propios fragmentos de metatarea textarea se ven así:

<?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
fuente
Depende de lo que estés haciendo. esc_textarea convertirá cualquier html a códigos de entidades HTML, por lo que no puede usarlo con un área de texto enriquecido como tinyMCE.
Jake