GET vs. POST Best Practices - PullRequest
       16

GET vs. POST Best Practices

14 голосов
/ 24 марта 2009

Для моего веб-приложения (PHP / MYSQL) я показываю список элементов и ссылку в каждой строке, чтобы удалить элемент. Прямо сейчас, ссылка

<a href='item.php?id=3&action=delete'>Delete Item</a>

Если бы я вместо этого хотел использовать POST ... как бы я это сделал (это динамически генерируемый список)? Могу ли я отправить данные POST без использования формы?

Или, для каждого предмета, я должен был бы сделать:

<form action='item.php?id={$item_id}' method='POST'>
    <input type='hidden' name='action' value='delete'>
    <input type='submit' value='delete item'>
</form>

и стиль кнопки отправки, чтобы выглядеть как исходная ссылка?

Я не знаком с php CURL или REST, помогут ли они решить эту проблему?

Ответы [ 10 ]

19 голосов
/ 24 марта 2009

Пожалуйста, используйте POST для всего, что изменяет постоянное состояние в базе данных. Вы не хотите, чтобы сканеры посещали ваши ссылки для удаления!
Прочитайте по адресу Архитектура Всемирной паутины, Тома 1 и URI, Адресность и использование HTTP GET и POST W3C.

Редактировать : Иногда, хотя вам нужно использовать GET. Например, URL-адреса активации членства, которые отправляются по электронной почте, являются GET и должны каким-то образом изменять базу данных.

18 голосов
/ 24 марта 2009

В общем случае не очень хорошо иметь запрос GET, который каким-то образом изменяет состояние системы, например, удаляет элемент.

Вы могли бы выглядеть так:

<form action='item.php' method='POST' id='form'>
    <input type='hidden' name='action' value='delete' />
    <input type='hidden' name='id' value='{item_id}' />
    <a href="" onclick="document.getElementById('form').submit(); return false;">Delete item</a>
</form>
8 голосов
/ 24 марта 2009

Вы никогда не должны изменять что-либо в своей базе данных (кроме информации журнала или других временных данных) из запроса GET. Проблема заключается в том, что существует различное программное обеспечение для веб-пауков, веб-ускорители, антивирусные программы и т. П., Которые будут выполнять запрос GET для каждого найденного URL-адреса; Вы не хотели бы, чтобы они автоматически удаляли элементы, когда они это делают. GET также уязвим для подделки межсайтовых запросов; если злоумышленник заставит одного из ваших пользователей щелкнуть ссылку, которая выполняет неверное действие (например, создать tinyurl, который перенаправляет на URL-адрес удаления), то он может заставить пользователя использовать свои разрешения для удаления чего-либо, не осознавая этого. 1001 *

Да, вам потребуется форма, которую вы отправляете для создания запроса POST. Другой вариант - использовать JavaScript и XMLHttpRequest, но это не будет работать для пользователей, у которых отключен JavaScript.

Вы также должны убедиться, что после того, как вы приняли данные из запроса POST, вместо того, чтобы возвращать новую страницу в ответ на этот запрос, вы должны перенаправить пользователя на страницу, к которой обращается запрос GET. Таким образом, они не будут случайно повторно отправлять POST-запрос, если нажмут на перезагрузку или нажмут кнопку «Назад» позже в ходе сеанса просмотра.

3 голосов
/ 24 марта 2009

Вот хороший пример того, почему не использовать GET для изменения состояния сервера:

http://www.infoworld.com/article/08/06/16/25FE-stupid-users-part-3-admins_5.html

Ключевая часть:

"Он вошел в административную зону и следовал по ссылке" удалить "для каждая запись ", - говорит админ.

Если бы удаление было закодировано как POST, этого бы никогда не произошло. (OTOH мы были бы лишены забавной истории сисадмина.)

3 голосов
/ 24 марта 2009

Вы не хотите использовать Get из-за принципа REST, который не позволяет Gets изменять состояние системы. Если вы не любите поисковые системы, чтобы удалить весь ваш контент.

Вам не понадобится форма для каждого предмета; Вы можете использовать один метод = отправлять форму по всему списку с типом ввода delete_ {id} = отправить. Или, что хитрее, . Имена разрешены на кнопках отправки.

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

Тот факт, что вы можете получить дополнительную, нежелательную информацию в представлении, смягчается средним случаем отправки намного большей страницы, чем необходимо, с помощью предложенного вами решения для формы на элемент, когда вы просто просматриваете список , Вы всегда можете использовать javascript, чтобы заменить поведение формы plain-old-html более разумной версией для клиентов с поддержкой javascript.

Если вы собираетесь сделать ссылку на «Get» для удаления, вы должны вернуть страницу подтверждения с этим «Get», который фактически делает сообщение после подтверждения.

2 голосов
/ 25 марта 2009

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

При этом применяются все остальные причины использования POST поверх GET (сканеры и т. П.).

0 голосов
/ 04 ноября 2011

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

0 голосов
/ 04 июля 2009

Вы не должны использовать href для удаления элемента.

Я бы предложил сделать это старомодным способом и реализовать форму для каждой строки / элемента.

Например:

<tr><td>Item 1</td><td><form action=/delete method=post><input type=hidden name=id value=1><input type=submit value=Delete></form></tr>
<tr><td>Item 2</td><td><form action=/delete method=post><input type=hidden name=id value=2><input type=submit value=Delete></form></tr>
<tr><td>Item 5</td><td><form action=/delete method=post><input type=hidden name=id value=5><input type=submit value=Delete></form></tr>

Два других варианта: 1) использование одного с для каждого элемента 2) Ajax (но вам нужно быть опытным в Ajax)

0 голосов
/ 24 марта 2009

Как уже говорили другие, это действительно плохая идея использовать GET для деструктивных операций, таких как удаление, особенно на веб-сайтах с выходом в Интернет (или корпорациях с устройством Google Mini), где сканеры могут случайно удалить все ваши данные.

Если вы не хотите использовать форму, используйте запрос XMLHttpRequest для отправки POST на ваш сервер. Вы даже можете установить метод DELETE, если ваш сервер поддерживает это.

Если вы не можете использовать JavaScript и XHR (ваши пользователи живут в 1999 году), и вы не хотите использовать форму в своем списке, используйте ссылку на отдельную страницу, где вы можете показать форму и, возможно, a 'Вы уверены?' сообщение.

Лучшее, что можно сделать, - это, вероятно, сочетание двух указанных выше вариантов: сделать ссылку на отдельную страницу с формой, но использовать JavaScript, чтобы перезаписать ссылку как вызов XHR. Таким образом, пользователи 1999 или 2009 года могут иметь оптимальный опыт.

0 голосов
/ 24 марта 2009

Еще лучше сделать это с помощью GET.

Если ваша проблема в том, что вам не нравится ужасный URL-адрес вашей ссылки, вы сможете исправить это с помощью mod_rewrite (если вы используете веб-сервер Apache).

Edit: Нет никакой причины использовать POST здесь. № Причина.

Люди здесь пишут о безопасных и небезопасных, как будто выбор метода может повлиять на безопасность в любом случае. Конечно, вы должны аутентифицировать своего пользователя независимо от того, какой метод вы выберете. Если вы этого не сделаете, значит, ваше программное обеспечение уже сломано . Если вы используете javascript для эмуляции отправки формы, когда у вас нет формы, и вам она не нужна, вам вообще не нужен javascript, значит ваше программное обеспечение уже сломано.

На самом деле, около 90% веб-программного обеспечения не работает, потому что люди не имеют представления о том, что они делают.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...