В чем разница между HTTP-Get и HTTP-POST и почему HTTP-POST слабее с точки зрения безопасности
Может ли кто-нибудь объяснить разницу между HTTP-GET и HTTP-POST? И почему люди говорят, что HTTP-POST слабее с точки зрения безопасности?
- Как установить заголовок Content-Type для запроса HttpClient?
- Клиент Android REST, образец?
- Как удалить расширение .svc в службе RESTful WCF?
- Можем ли мы подключить удаленную базу данных MySQL на Android с помощью JDBC?
- Вызов веб-служб REST с classической страницы asp
- Использование HTTPS с REST в Java
- Джерси: верните список строк
- Почему медленное поглощение WADL?
В запросе HTTP GET пары ключ / значение указываются в URL-адресе:
http://server/something?value1=foo&value2=bar
.
В запросе HTTP POST пары ключ / значение отправляются как часть HTTP-запроса после заголовков. Например:
POST / что-то HTTP / 1.1 Хост: сервер Контент-длина: 21 Content-Type: application / x-www-form-urlencoded значение1 = Foo & значение2 = бар
Трудно описать один как более безопасный, чем другой, но HTTP POST-данные не отображаются в URL-адресе, а при отправке данных на веб-сайт HTTP POST обычно может выполняться только в результате взаимодействия с пользователем ( например, нажав кнопку «Отправить»).
Это означает, что пользователь не может быть обманут при посещении URL-адреса, например http://server/update_profile?name=I_suck
а конфиденциальные данные не http://server/update_profile?name=I_suck
в URL-адресе.
Вы также можете использовать nonces и другие антиблокировочные маркеры с html-формами (которые используют POST) для предотвращения других форм подделок для запросов на межсайтовый запрос.
В общем случае POST должен использоваться для запросов, которые потенциально могут изменить состояние на сервере, а GET следует использовать для операций только для чтения.
Спецификация HTTP отличает POST и GET с точки зрения их намерения:
GET является idempotent: он предназначен для получения ресурса, не изменяя ничего на сервере. Как следствие, должно быть совершенно безопасно повторно отправить запрос GET.
POST не является: он предназначен для обновления информации на сервере. Поэтому нельзя предполагать, что можно повторно отправить запрос, поэтому большинство браузеров запрашивают подтверждение при нажатии обновления в запросе POST.
Что касается безопасности, то никакой разницы. Возможно, POST более неясен, но это совсем другое дело. Безопасность необходимо добавить на другой уровень, например SSL.
Некоторые заметки о запросах GET:
- Запросы GET можно кэшировать
- Запросы GET остаются в истории браузера
- Запросы GET можно добавить в закладки
- Запросы GET никогда не должны использоваться при работе с конфиденциальными данными
- Запросы GET имеют ограничения по длине
- Запросы GET должны использоваться только для извлечения данных
Некоторые примечания по запросам POST:
- Запросы POST никогда не кэшируются
- Запросы POST не сохраняются в истории браузера
- Запросы POST не могут быть отмечены закладкой
- Запросы POST не имеют ограничений на длину данных
(Источник: W3 Schools)
Я бы не назвал POST более или менее безопасным, чем GET. По общему признанию, параметры отображаются как часть URL-адреса при использовании GET, поэтому любые конфиденциальные данные будут немедленно видны пользователю. Тем не менее, тривиально просматривать и даже изменять любую часть HTTP-запроса, поэтому просто потому, что POST не передает данные через URL-адрес, который все еще можно легко прочитать. Если вы не используете HTTPS, GET и POST будут передавать данные в легкодоступной форме.
Метод GET предназначен только для поиска данных и не должен иметь никаких побочных эффектов . Но POST предназначен для этой конкретной цели: изменение данных на стороне сервера.
Запросы GET могут быть легко отклонены (см. « Подделка запросов на межсайтовый запрос» ), просто поместив изображение на страницу, в то время как запросы POST не так просто (это также является причиной, по которой вы должны разрешать разрешенные POST-запросы).