Bagaimana mencegah melarikan diri ketika menyimpan kode HTML dalam nilai opsi?

9

Saya memiliki halaman Opsi Tema di mana pengguna dapat menambahkan opsi tertentu seperti tautan Facebook, dll. Salah satu opsi adalah untuk beberapa kode iklan dan ketika menyimpannya sebagai opsi, ia akan lolos berulang kali.

Apa pendekatan terbaik untuk menyimpan kode yang dimasukkan dalam halaman admin <textarea>menggunakan update_option( 'sidebar_code', $_POST['sidebar_code'] );?

Amit
sumber

Jawaban:

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

tetapi Anda harus tahu bahwa filter kses tidak 100% aman.

onetrickpony
sumber
2
apa maksudmu dengan tidak 100% aman?
Amit
Maksud saya seseorang masih dapat XSS situs Anda jika mereka benar-benar baik. Jika saya tidak salah patch wp terakhir memperbaiki kerentanan xss dalam fungsi kses
onetrickpony
kses menghapus semua atribut kelas tambahan dan html (misalnya class = "classname" width = "100") apakah ada cara untuk menyiasatinya?
Talon
11

Saya mengambil pendekatan lain untuk ini. Saya menyandikan dan mendekodekan opsi saya dengan entitas HTML. Satu hal yang saya tidak yakin adalah apakah ini membuka pintu belakang yang buruk bagi orang-orang untuk mendorong kompromi HTML melalui. Saya mengandalkan fakta bahwa hanya admin yang akan mengedit opsi tema, tapi mungkin saya naif?

Berikut ini tampilannya saat saya menyimpan opsi:

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

Dan ini terlihat seperti ketika saya mengambil opsi:

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

sumber
2

Ini bukan jawaban lengkap untuk pertanyaan Anda, tetapi mungkin mengarahkan Anda ke arah yang benar: Anda dapat mencoba <?php esc_textarea( $text ) ?>, sebagaimana dirinci oleh kodeks di sini: http://codex.wordpress.org/Function_Reference/esc_textarea .

Cuplikan metabox textarea saya sendiri terlihat seperti ini:

<?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
sumber
Tergantung pada apa yang Anda lakukan. esc_textarea akan mengonversi html apa pun ke kode entitas HTML, jadi Anda tidak dapat menggunakannya dengan area teks kaya seperti tinyMCE.
Jake