По всему интернету я вижу следующий совет:
GET никогда не должен изменять данные на сервере - используйте для этого запрос POST
Что лежит в основе этой идеи?
Если я создаю php-сервис, который вставляет данные в базу данных и передает их параметры в строку запроса GET, почему это неправильно? (Я использую подготовленные операторы, чтобы заботиться о SQL-инъекции). Является ли POST-запрос более безопасным?
Или есть какая-то историческая причина для этого? Если да, насколько актуален этот совет сегодня?
http
http-request
Девдатта Тенгше
источник
источник
Ответы:
Это не совет.
A
GET
определяется таким образом в протоколе HTTP . Он должен быть идемпотентным и безопасным .Что касается того, почему -
GET
можно кэшировать и обновлять в браузере. Снова и снова и снова.Это означает , что если вы сделаете то же самое
GET
еще раз, вы будете вставлять в вашу базу данных снова .Подумайте, что это может означать, если
GET
ссылка становится ссылкой и сканируется поисковой системой. Ваша база данных будет заполнена повторяющимися данными.Я также предлагаю читать URI, адресуемость и использование HTTP GET и POST .
Существует также проблема с предварительной загрузкой ссылок в некоторых браузерах - они будут вызывать ссылки предварительной выборки, даже если автор страницы не указал это.
Если, скажем, ваш выход из системы происходит за «GET», на который ссылается каждая страница вашего сайта, люди могут выйти из системы только из-за этого поведения.
источник
GET
это никогда не будет разрушительным действием (справедливо, поскольку это определено так). Если вы теперь нарушите свое приложение, нарушив эту спецификацию, вы сохраните обе части своего приложения.GET
. Этот совет просто неверен. Безопасный означает, что пользователь не может нести ответственность за побочные эффекты, а также что побочные эффекты не могут быть. В противном случае вы не могли бы иметь файлы журнала для вашего сервера, что было бы абсурдом! Это четко изложено в разделе 9.1.1 RFC2616.GET
не должен изменять ресурс, запрашиваемый объектомGET
, но это не означает, что «ничего на сервере не должно меняться». Конечно, такие вещи, как журналы, счетчики и другое состояние сервера могут меняться во время любого запроса.Каждый HTTP-глагол имеет свою ответственность. Например
GET
, как определено RFCPOST
с другой стороны, означает вставить или более формальноПричины для сохранения этого пути:
GET
в качестве средства поиска информации и добычи данныхGET
- это, по сути, чтение , тогда как,POST
по сути, записьGET
и тот же URL-адрес должен возвращать одинаковые результаты всем пользователям, иначе вы не будете доверять возвращаемому результату.Для полноты и просто для обеспечения правильного использования (источник) :
GET
параметры передаются как часть URL, который по умолчанию имеет небольшую и ограниченную длину в 256 символов, при этом некоторые серверы поддерживают более 4000 символов. Если вы хотите вставить длинную запись, нет законного способа передать эти данные в̶G̶E̶T̶
̶ передаются открытым текстом. URL-адрес фактически зашифрован с помощью TLS, поэтому с TLS все в порядке.GET
, нецелесообразнаGET
повторяется, если пользователь нажимает кнопку «Назад» в браузере?
знаком внутриисточник
РЕДАКТИРОВАТЬ: Ранее я сказал, что POST помогает защитить вас от CSRF, но это неправильно. Я не продумал это правильно. Вы должны требовать уникальный скрытый маркер области сеанса во всех ваших запросах, чтобы изменить данные для защиты от CSRF.
В первые дни Интернета были браузерные ускорители. Эти программы начнут щелкать ссылки на странице для кэширования содержимого. Google Web Accelerator был одной из таких программ. Это может нанести ущерб приложению, которое вносит изменения при нажатии на ссылку. Я бы сделал предположение, что есть еще люди, использующие программное обеспечение ускорителя.
Прокси-серверы и браузеры будут кэшировать GET-запросы, поэтому, когда пользователь снова обращается к странице, он может не отправлять запрос в ваше приложение, поэтому пользователь думает, что он совершил действие, но на самом деле это не так.
источник
Самый простой ответ - «потому что это не
GET
значит».Использование
GET
для передачи данных для обновления похоже на написание любовного письма и отправку его в конверте с пометкой "СПЕЦИАЛЬНОЕ ПРЕДЛОЖЕНИЕ - ДЕЙСТВУЙ!" В обоих случаях вы не должны удивляться, что получатель и / или посредники неправильно обрабатывают ваше сообщение .источник
Для ваших операций CRUD в приложении, ориентированном на базу данных, используйте следующую схему:
Использовать HTTP GET для операций чтения (SQL SELECT)
Использовать HTTP PUT для операций обновления (SQL UPDATE)
Использовать HTTP POST для операций создания (SQL INSERT)
Использовать HTTP DELETE для операций удаления (SQL DELETE)
источник
Этот совет и все ответы здесь неверны. Очевидно, что я чрезмерно драматичен, другие ответы превосходны, но я считаю, что точный совет должен быть дан как:
Сказать «никогда» не является слишком экстремальным, и хотя другие ответы здесь точно объясняют, почему вы должны «редко» делать это, есть некоторые сценарии, когда совершенно разумно изменять данные с помощью GET. Примером является одноразовая ссылка для проверки электронной почты. Обычно эти ссылки содержат GUID, который при обращении должен будет изменить данные. При правильной реализации последующие идентичные запросы GET будут игнорироваться.
Это, очевидно, крайний случай, но, безусловно, стоит отметить.
источник