Почему вы должны удалить HTTP POST или DELETE, а не GET?

Я работаю над учебниками Microsoft ASP.NET MVC, заканчивая на этой странице

http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

В нижней части этой страницы делается следующее выражение:

В общем, вы не хотите выполнять HTTP GET-операцию при вызове действия, которое изменяет состояние вашего веб-приложения. При выполнении удаления вы хотите выполнить HTTP POST или, еще лучше, операцию HTTP DELETE.

Это правда? Может ли кто-нибудь предложить более подробное объяснение обоснования этого утверждения?

Изменить

Wikipedia утверждает следующее:

Некоторые методы (например, HEAD, GET, OPTIONS и TRACE) определяются как безопасные, что означает, что они предназначены только для извлечения информации и не должны изменять состояние сервера.

В отличие от этого, такие методы, как POST, PUT и DELETE, предназначены для действий, которые могут вызывать побочные эффекты либо на сервере

Ответ 1

Ответ Джона Скита - это канонический ответ. Но: предположим, что у вас есть ссылка:

href = "\myApp\DeleteImportantData.aspx?UserID=27"

и google-бот идет и индексирует вашу страницу? Что происходит потом?

Ответ 2

GET обычно не содержит побочных эффектов - другими словами, он не меняет состояние. Это означает, что результаты можно кэшировать, закладки можно безопасно и т.д.

Из HTTP 1.1 RFC 2616

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

В частности, конвенция была что GET и HEAD методы НЕ ДОЛЖНЫ значимость принятия другого чем поиск. Эти методы должны считаться "безопасным". Это позволяет пользователю агенты для представления других методов, таких как POST, PUT и DELETE, в особым образом, чтобы пользователь был создан осознавая тот факт, что возможно запрашивается небезопасное действие.

Естественно, невозможно убедитесь, что сервер не генерировать побочные эффекты в результате выполнение запроса GET; на самом деле, некоторые динамические ресурсы считают, что особенность. Важное различие вот что пользователь не запрашивал побочные эффекты, поэтому не могут быть привлеченным к ответственности за них.

Ответ 3

Помимо пуристских проблем вокруг идемпотента, есть практическая сторона: пауки/боты/искатели и т.д. будут следовать за гиперссылками. Если у вас есть действие "удалить" как гиперссылку, которая выполняет GET, Google может весело удалить все ваши данные. См. " The Spider of Doom.

С сообщениями это не риск.

Ответ 4

Пожалуйста, см. мой ответ здесь. В равной степени это относится и к этому вопросу.

  • Предварительная выборка: Многие веб-браузеры будут использовать предварительную выборку. Что значит что он загрузит страницу перед вами нажмите на ссылку. Предполагая, что вы нажмете на эту ссылку позже.
  • Боты: Есть несколько ботов, которые сканируют и индексируют Интернет для Информация. Они будут выдавать только GET Запросы. Вы не хотите удалять что-то из запроса GET для этого причина.
  • Кэширование: GET HTTP-запросы не должны изменять состояние, и они должны быть идемпотентными. Идемпотент означает, что выдача запроса один раз или его выдача несколько раз дает тот же результат. То есть побочных эффектов нет. Для эта причина GET HTTP-запросов жестко привязанный к кешированию.
  • HTTP-стандарт говорит, что: стандарт HTTP говорит, что каждый HTTP-метод для. Несколько программ построены для использовать стандарт HTTP, и они предполагают что вы будете использовать его так, как вы предположил. Таким образом, у вас будет undefined поведение от множества если вы не следуете.

Ответ 5

Другой пример.

http://example.com/admin/articles/delete/2

Это приведет к удалению статьи, если вы вошли в систему и имеете правильные права. Если ваш сайт принимает комментарии, например, и пользователь передает эту ссылку в качестве изображения; так:

<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>

Затем, когда вы сами, как пользователь admin, просматриваете комментарии на своем сайте, браузер попытается извлечь это изображение, отправив запрос на этот URL. Но поскольку вы вошли в систему, пока браузер делает это, статья будет удалена.

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

Надеюсь, что это имеет смысл.

Ответ 6

В дополнение к паукам и запросам, которые должны быть идемпотентными, также возникает проблема безопасности с запросами на получение. Кто-то может легко отправить своим пользователям электронное письмо с помощью

<img src="http://yoursite/Delete/Me" />

в тексте, и браузер с радостью пойдёт и попытается получить доступ к ресурсу. Использование POST не является лекарством от таких вещей (поскольку вы можете легко собрать сообщение в javascript), но это хороший старт.

Ответ 7

Об этой теме (использование методов HTTP), я рекомендую прочитать это сообщение в блоге: http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/

На самом деле это противоположная проблема: почему бы не использовать POST, когда данные не изменены.

Ответ 8

Другая проблема с GET заключается в том, что команда отправляется в адресную строку браузера. Поэтому, если вы обновляете страницу, вы снова выдаете команду, будь то "удалить последний материал", "отправить заказ" или аналогичный.

Ответ 9

Скажем, у нас есть приложение для интернет-банкинга, и мы переходим на страницу передачи. Зарегистрированный пользователь решает перевести 10 долларов США в другую учетную запись.

Нажатие на кнопку отправки перенаправляет (как запрос GET) на https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j

Но подключение к Интернету происходит медленно и/или сервер занят, поэтому после нажатия кнопки отправки новая страница медленно загружается.

Пользователь получает разочарование и начинает поражать F5 (обновить страницу) яростно. Угадайте, что произойдет? Возможно, произойдет более одной передачи, возможно, опуская учетную запись пользователя.


Теперь, если запрос сделан как POST (или что-то еще, чем GET), первая F5 (страница обновления), пользователь сделает браузер, мягко спросит: "Вы уверены, что хотите это сделать?" Он может иметь побочные эффекты [ bla bla bla]... "