Как предотвратить экранирование при сохранении HTML-кода в значении параметра?

9

У меня есть страница «Параметры темы», на которой пользователь может добавлять определенные параметры, например ссылки в Facebook и т. Д. Один из вариантов - для некоторого рекламного кода, и при его сохранении в качестве опции он снова и снова экранируется.

Каков наилучший подход для сохранения кода, вставленного на страницу администратора, с <textarea>помощью update_option( 'sidebar_code', $_POST['sidebar_code'] );?

Amit
источник

Ответы:

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

но вы должны знать, что фильтр kses не на 100% безопасен.

onetrickpony
источник
2
что вы подразумеваете под не 100% безопасным?
Амит
Я имею в виду, что кто-то может по-прежнему XSS ваш сайт, если они действительно хороши в этом. Если я не ошибаюсь, последний патч wp исправил xss-уязвимость в функциях
kses
kses удаляет все дополнительные атрибуты class и html (например, class = "classname" width = "100"), есть ли способ обойти это?
Коготь
11

Я принял другой подход к этому. Я закодировал и расшифровал свои опции с помощью HTML-сущностей. Одна вещь, в которой я не уверен, - открывает ли это неприятную заднюю дверь для людей, чтобы вести компрометирующий HTML через. Я полагаюсь на то, что в любом случае редактировать опции темы будут только администраторы, но, может быть, я наивен?

Вот как это выглядит, когда я сохраняю опцию:

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

И вот как это выглядит, когда я получаю опцию:

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

источник
2

Это не полный ответ на ваш вопрос, но, возможно, указывает правильное направление: вы можете попробовать <?php esc_textarea( $text ) ?>, как подробно описано в кодексе здесь: http://codex.wordpress.org/Function_Reference/esc_textarea .

Мои собственные фрагменты metabox textarea выглядят так:

<?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
источник
Зависит от того, что вы делаете. esc_textarea преобразует любой html в коды сущностей HTML, поэтому вы не можете использовать его с областью richtext, например tinyMCE.
Джейк