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

13 янв. 2011 г., 21:05:11
Просмотры: 21K
Голосов: 10

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

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

0
Все ответы на вопрос 3
0
12

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

Вот как это выглядит при сохранении настройки:

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

А так выглядит получение настройки:

html_entity_decode(get_option('my_option',htmlentities($my_default_value)));
3 февр. 2011 г. 17:12:47
3
stripslashes(wp_filter_post_kses(addslashes($_POST['sidebar_code'])));

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

13 янв. 2011 г. 21:46:03
Комментарии

что ты имеешь в виду под "не на 100% безопасно"?

Amit Amit
14 янв. 2011 г. 00:09:12

Я имею в виду, что кто-то всё ещё может провести XSS-атаку на твой сайт, если он действительно хорош в этом. Если я не ошибаюсь, последний патч WordPress исправил уязвимость XSS в функциях kses

onetrickpony onetrickpony
14 янв. 2011 г. 02:29:02

kses удаляет все дополнительные классы и HTML-атрибуты (например, class="classname" width="100"). Есть ли способ обойти это?

Talon Talon
18 окт. 2012 г. 01:07:09
1

Это не полный ответ на ваш вопрос, но, возможно, он направит вас в правильном направлении: вы можете попробовать <?php esc_textarea( $text ) ?>, как описано в кодексе здесь: http://codex.wordpress.org/Function_Reference/esc_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 />';
  }
?>
19 июл. 2011 г. 10:45:37
Комментарии

Зависит от того, что вы делаете. esc_textarea преобразует любой HTML в HTML-сущности, поэтому вы не можете использовать его с расширенным текстовым полем, таким как tinyMCE.

Jake Jake
16 июл. 2012 г. 18:00:54