Come evitare l'escaping quando si salva il codice HTML in un valore di opzione?


9

Ho una pagina Opzioni tema in cui l'utente può aggiungere alcune opzioni come i link di Facebook, ecc. Una delle opzioni è per alcuni codici degli annunci e quando lo salva come opzione viene evitato più e più volte.

Qual è l'approccio migliore per il salvataggio del codice inserito in una pagina di amministrazione <textarea>utilizzando update_option( 'sidebar_code', $_POST['sidebar_code'] );?

Risposte:


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

ma dovresti sapere che il filtro kses non è sicuro al 100%.


2
cosa intendi con non sicuro al 100%?
Entro il

Voglio dire che qualcuno potrebbe ancora XSS il tuo sito se sono davvero bravi a farlo. Se non sbaglio, l'ultima patch di wp ha risolto una vulnerabilità xss nelle funzioni di
kses

kses elimina tutti gli attributi extra di classe e html (es. class = "classname" width = "100") c'è un modo per aggirare questo?
Talon,

11

Ho adottato un altro approccio a questo. Ho codificato e decodificato le mie opzioni con entità HTML. Una cosa di cui non sono sicuro è se questo apre una brutta porta sul retro per consentire alle persone di compromettere l'HTML. Mi affido al fatto che solo gli amministratori modificheranno comunque le opzioni del tema, ma forse sono ingenuo?

Ecco come appare quando salvo un'opzione:

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

E questo è come appare quando recupero un'opzione:

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

2

Questa non è una risposta completa alla tua domanda, ma probabilmente ti indirizza nella giusta direzione: potresti provare <?php esc_textarea( $text ) ?>, come dettagliato dal codice qui: http://codex.wordpress.org/Function_Reference/esc_textarea .

I miei frammenti di textarea metabox si presentano così:

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

Dipende da cosa stai facendo. esc_textarea convertirà qualsiasi codice HTML in codice di entità HTML, quindi non puoi usarlo con un'area richtext come tinyMCE.
Jake,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.