Я на самом деле инженер в VIP, который много пересматривает код :) Я отмечаю пропущенные побеги.
но не выходит из вывода
Не совсем, это не уходит на выходе, что удивительно для большинства людей. Это потому, что если вы супер администратор, у вас есть такая unfiltered_html
возможность, поэтому она не может выйти на выходе. Вместо этого он запускает его wp_kses_post
на входе. В идеале вы бы удалили эту возможность, хотя.
Вот реализация в настоящее время:
function the_content( $more_link_text = null, $strip_teaser = false ) {
$content = get_the_content( $more_link_text, $strip_teaser );
/**
* Filters the post content.
*
* @since 0.71
*
* @param string $content Content of the current post.
*/
$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]>', $content );
echo $content;
}
С the_content
другой стороны, идеальный механизм для избежания всего, что проходит через фильтр:
echo apply_filters( 'the_content', wp_kses_post( $content ) );
Таким образом, мы делаем содержимое безопасным, а затем пропускаем его через фильтр, избегая удаления вложений и т. Д.
Так зачем убегать
Смысл экранирования состоит в том, чтобы генерировать действительный HTML, а дополнительная безопасность, которую он обеспечивает, является просто приятным побочным эффектом.
Чтобы пользователи случайно не сломали разметку
Есть много причин, чтобы убежать, но в основном вы оправдываете ожидания. Возьмите следующий код:
<a href="<?=$url?>">
Мы ожидаем, $url
что URL будет подходящим для href
атрибута, но что, если это не так? Хорошо, почему это оставлено на волю случая, давайте обеспечим это:
<a href="<?=esc_url( $url )?>">
Теперь это всегда будет URL. Не имеет значения, вставит ли изображение хакер $url
, или пользователь введет неправильное поле, или существует вредоносный скрипт. Это всегда будет действительный URL, потому что мы сказали, что это будет URL. Конечно, это может быть очень странный URL, но он всегда будет соответствовать ожиданиям, что URL будет там. Это очень удобно, будь то для проверки разметки, безопасности и т. Д.
Сказав, что побег не является проверкой, побег не санитария. Это отдельные шаги, которые происходят в разные моменты жизненного цикла. Побег заставляет вещи соответствовать ожиданиям, даже если это мешает им сделать это.
Иногда мне нравится думать о том, чтобы сбежать как одно из тех японских игровых шоу с гигантской пенопластовой стеной с вырезом. Участники должны соответствовать форме собаки, или они выбрасываются, только для наших целей есть лазеры и ножи вокруг отверстия. Все, что осталось в конце, будет в форме собаки, и это будет неумолимым и строгим, если вы еще не в форме собаки.
Помните:
- санировать рано
- подтвердить рано
- бежать поздно
- часто убегать
Безопасность - это многоэтапный, многоуровневый метод защиты, выход - один из внешних уровней защиты на выходе. Он может искажать код атаки на скомпрометированном сайте, делая его бесполезным, мешать открывать эксплойты и следить за тем, чтобы ваш клиент не нарушал сайт, помещая теги в поля, которые они не должны. Это не замена для других вещей, и это, безусловно, самый недоиспользуемый инструмент безопасности в руководстве для разработчиков.
Что касается того, почему бежать, если the_content
нет? Если у вас есть наводнение и 5 дыр в стене, но только для того, чтобы исправить 3, вы пожимаете плечами и ничего не исправляете? Или вы уменьшаете риск и уменьшаете зону атаки?
Возможно, я могу помочь исправить эти последние 2 отверстия с помощью этого фрагмента:
add_filter( 'the_content' function( $content ) {
return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );
Здесь мы устанавливаем приоритет на максимально возможное число в PHP, затем добавляем 1, чтобы оно переполнялось до минимально возможного числа, которое может быть представлено. Таким образом, все вызовы the_content
будут избегать значения до любых других фильтров. Этот способ встраивания и т. Д. Все еще работает, но пользователи не могут проникнуть в опасный HTML через базу данных. Кроме того, обратите внимание на удаление unfiltered_html
возможности из всех ролей
wp_kses_post