Потенциальная дырка в wp_rel_nofollow()

Возможность превращения nofollow-ссылок в DoFollow

Копаясь в коде , обнаружил одну особенность функции wp_rel_nofollow() (функция используется для добавления rel="nofollow" к ссылкам): регулярное выражение, отвечающее за поиск ссылок, слишком упрощено.

[-]
View Code PHP
  1. function wp_rel_nofollow( $text ) {
  2.     global $wpdb;
  3.     // This is a pre save filter, so text is already escaped.
  4.     $text = stripslashes($text);
  5.     $text = preg_replace_callback('|<a (.+?)>|i', 'wp_rel_nofollow_callback', $text);
  6.     $text = esc_sql($text);
  7.     return $text;
  8. }
  9.  
  10. /**
  11.  * Callback to used to add rel=nofollow string to HTML A element.
  12.  *
  13.  * Will remove already existing rel="nofollow" and rel='nofollow' from the
  14.  * string to prevent from invalidating (X)HTML.
  15.  *
  16.  * @since 2.3.0
  17.  *
  18.  * @param array $matches Single Match
  19.  * @return string HTML A Element with rel nofollow.
  20.  */
  21. function wp_rel_nofollow_callback( $matches ) {
  22.     $text = $matches[1];
  23.     $text = str_replace(array(' rel="nofollow"', " rel='nofollow'"), '', $text);
  24.     return "<a $text rel=\"nofollow\">";
  25. }

Таким образом, этот код пропустит, например, такую ссылку:

[-]
View Code HTML
<a href="http://blog.sjinks.pro/"
title="MyBlog">Some Text</a>

и неправильно обработает такую:

[-]
View Code HTML
<a href="http://blog.sjinks.pro/" rel="external">Some text</a>

(во втором случае rel="nofollow" будет добавлен после rel="external", что будет некорректным HTML — но я не знаю, как такое воспримут поисковые системы: учтут ли они rel="nofollow" или нет).

Почему же эта дырка только потенциальная? Всё дело в том, что WordPress использует систему KSES, которая исправляет многие ошибки в HTML, а также переводит тэги в однострочную форму.

Тем не менее, пользователи, имеющие привилегию (capability) unfiltered_html (по умолчанию это пользователи с ролями Администратор (Administrator) и Редактор (Editor), но существуют плагины, которые могут это изменить), не подвергаются фильтрации KSES и, как следствие, могут размещать любой HTML-код.

Соответственно, все плагины, использующие wp_rel_nofollow(), но не использующие KSES, уязвимы.

Хотя описанную ошибку использовать довольно сложно (нужно быть редактором), если найти ошибку в KSES, то преобразовывать ссылки в DoFollow будет гораздо легче. Очень надеюсь, что к выходу WordPress 3.0 это исправят :-)

Автор: ; опубликовано в: WordPress; метки: WordPress, ошибка
1
Янв
2010

RSS Комментарии к статье «Потенциальная дырка в wp_rel_nofollow()» (2)  »

  1. Ну,если дырка только потенциальная,то и волноваться не стоит

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Потенциальная дырка в wp_rel_nofollow()»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा