Некоторые системы управления позволяют удалять материалы и производить прочие важные вещи не через формы, а по ссылкам, предварительно запросив подтверждение javascript (Вы действительно хотите удалить?). Ссылка для удаления страницы с id=48, может выглядеть, например, так: example.com/admin/content/delete/48. Далее в системе управления проверяются права текущего пользователя и в случае успеха материал удаляется.

Суть проблемы

На сервере не проверяется, действительно ли удаление запрошено пользователем только что или его подставили.

Предположим, система позволяет вставлять изображения в гостевой книге или указывать ссылку на изображение в профиле пользователя. Пользователь, не имея никаких прав на удаление материалов на сайте (обычный такой пользователь) дает ссылку не на изображение, а на вышеприведенную страницу. Изображение, разумеется, не отображается, но кого это волнует? Цель достигнута: как только администратор с требуемыми правами зайдет на страницу с этим псевдоизображением, будет запрошена страница, указанная как источник изображения. На той стороне будут проверены права (администратор? да) и материал будет удален.

Много редакторов

Предположим, на сайте много редакторов с различными правами, больше одного. Каждый редактор имеет права на свой раздел: кто-то на новости, кто-то на товары в каталоге. Теоретически у первого нет права удалять материалы второго. Тем не менее, воспользовавшись вышеописанным механизмом, горизонты кардинально расширяются.

Так понемножку, по чуть-чуть, можно выпилить чуть ли не весь сайт.

Как сделано в Drupal

Drupal – безопасная система управления сайтом. Как побороли эту проблему в Друпале:

  • Каждое важное действие (добавление, изменение, удаление) – это форма POST
    Ссылки – для навигации. Внимательный программист совершенно справедливо заметит, что сформировать POST – плевое дело. Но описанная подстава не сработает по причине, описанной в следующем пункте.
  • Каждая форма имеет ТОКЕН. Это уникальный буквенно-цифровой идентификатор, привязывающий пользователя к выданной ему форме. Далее при получении и проверке данных из формы система управления друпал проверяет, соответствует ли токен сформированной формы токену формы, присланной из браузера. Если нет – проверка не проходит.

Проверьте себя и свою систему управления. Если она не Drupal.