Почему протокол передачи гипертекста даже позволяет вносить изменения с помощью запроса GET? - PullRequest
0 голосов
/ 24 апреля 2018

Вы никогда не должны использовать GET для изменения данных на сервере , это очевидно.Реальный вопрос:

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

  1. GET-запросы могут кэшироваться

  2. GET-запросы могут оставаться в истории браузера

  3. GET-запросы могут быть добавлены в закладки

  4. GET-запросы могут быть распределены и распространены

  5. GET-запросы могут быть взломаны

Ссылка на приведенные выше 5 операторов ^ .

Очевидно, что вам никогда не следует использовать GET в этом случае:

1.Не используйте GET для этого!

2.Нет, вы все еще не можете использовать GET для этого!

3.Вы ПОЛУЧАЕТЕ это еще? (посмотрите, что я там делал)?

Итак, еще раз, я спрашиваю, , почему все еще возможно изменить данные, используя GET?Почему они просто не делают эту операцию только для чтения ?Тогда вам даже не придется беспокоиться о неправильном использовании GET или злонамеренном использовании GET .

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Исходя из ответа и комментариев «Глупс», «HTTP - это просто стандарт - стандарты ничего не контролируют».

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

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

Ваш пример Microsoft не подходит, потому что это компания, которая создала приложение (или ОС? API? На что вы ссылались?), Которое обязывает вас не хранитьсимвольный литерал в типе данных int.Для HTTP, вероятно, существует такое учреждение (я должен признать, что я не уверен, кто-то владеет стандартом HTTP? W3C, IETF?), Но нет всеобъемлющего приложения / OS / API, которое могло бы обеспечить соблюдение правил.Правила применяются пользователями и тем, как они их интерпретируют и применяют.И некоторые правила (например, «глагол для извлечения элемента - GET») применяются более строго, чем другие (например, «GET безопасен и идемпотентен»).

Сравните его с кем-то из США.посещение Нидерландов.Посетитель привык к формату времени AM / PM.Никто не заставит ее использовать 24-часовой формат, там нет полицейских формата времени.Но она быстро обнаружит, что многие голландцы запутались, потому что они не знают, утром или днем ​​AM или что-то еще.

Итак, чтобы подвести итог, почему все еще возможно изменять данные с помощью GETили использовать глагол RETRIEVE вместо GET, если хотите?Потому что HTTP - это стандарт, который имеет силу только благодаря своим пользователям.

Надеюсь, я сделал это более ясным в своем ответе (я был вызван вопросом, очень интересным).

0 голосов
/ 30 апреля 2018

Почему протокол передачи гипертекста даже позволяет вносить изменения с помощью запроса GET?

Это не так. спецификация гласит:

4.2.1. Безопасные методы

Методы запроса считаются «безопасными», если их определенная семантика по сути только для чтения; клиент не запрашивает, и не ожидает какого-либо изменения состояния на исходном сервере в результате применения безопасного метода к целевому ресурсу. Точно так же, разумное использование безопасного метода не должно причинять вреда, потеря имущества или необычное бремя на сервере происхождения.

...

Из методов запроса, определенных в этой спецификации, GET, Методы HEAD, OPTIONS и TRACE определены как безопасные.


Итак, еще раз, я спрашиваю, почему все еще возможно изменить данные с помощью GET?

Потому что некоторые люди пишут код HTTP-сервера, который нарушает эту часть спецификации HTTP.

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

0 голосов
/ 24 апреля 2018

То, что кто-то говорит «не делай этого», не означает, что это невозможно сделать.

Правильное использование / реализация HTTP , как описано в официальной спецификации , не приведет к изменениям данных, вызванным запросами GET.

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

Редактировать, чтобы добавить: После всего нашего предыдущего обсуждения, я думаю, мне нужно идтив глубину, чтобы объяснить это подробно.

TL; DR;- изучить, как на самом деле работает сетевой трафик.

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

МыНачнем с самого нижнего уровня оборудования и продолжим наш путь.

Уровень 1 - ваша сетевая карта

Цель этой карты - просто предоставить путь длядвижение.Это все, что он делает.Он не выполняет никакой фильтрации - это работа верхних уровней.Микропрограмма сетевой карты не знает о first HTTP, поэтому не имеет значения, является ли запрос GET или нет.

Ваша сетевая карта будет НЕ ограничивать запрос HTTP GET от каких-либо действий.

Второй уровень - стек TCP / IP (Это несколькообобщенно. Вероятно, есть еще несколько уровней для управления некоторыми коммуникациями, о которых я не знаю, так как я не сетевой инженер. И, технически, стек TCP / IP - это два уровня.)

TCP иIP начал свою жизнь как программное обеспечение, написанное по стандартам TCP и IPТаким образом, вполне возможно, что разные поставщики программного обеспечения могут написать свои собственные интерпретации и игнорировать элементы стандарта, если они пожелают (и я не удивлюсь, если это действительно произойдет, когда стандарт станет более зрелым).В конце концов, стандарт стал настолько повсеместным, что он перешел на прошивку самих сетевых карт.На этом этапе TCP / IP можно рассматривать как аппаратную реализацию.

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

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

IP работает, заключая фактические данные, отправляемые в пакет данных, добавляя направления (IP-адрес и порт, а также несколько других) дляДоставка.Фактическое содержимое пакета игнорируется, поскольку оно не входит в сферу ответственности уровня IP.

Обратите внимание, что заголовки HTTP НЕ являются частью механизма IP-адресации - они являются частью доставляемого содержимого..

Уровень три - программное обеспечение

Для обработки пакета данных IP, программы попросят зарезервировать порт для себя, сообщив стеку IP: «Отправьте любые данные, поступающие вна этот порт прямо мне ".

ЛЮБОЙ программный пакет может зарезервировать ЛЮБОЙ порт, но только привязка программного обеспечения к порту является сделкой 1: 1.Одна программа на один порт и один порт на программу.

HTTP стандарт - это порт 80, но ОЧЕНЬ распространено использовать разные порты (например, 8080) для тестирования веб-сайтов перед их развертыванием напорт 80.

Однако вполне возможно использовать порт 80 для другой цели - вы можете использовать его для сервера Telnet, FTP-сервера, пользовательского протокола - даже DNS-сервера, если хотите.Стек TCP / IP НЕ ЗАБЫВАЕТ о том, что вы делаете с портом, он ТОЛЬКО заботится о доставке данных в "парадную дверь".

Так как равен возможно (и нередко) многократное использование портов для разных вещей. TCP / IP не будет выполнять фильтрацию контента.Опять же, HTTP-запрос GET НЕ будет фильтроваться в стеке TCP / IP, потому что пакет программного обеспечения отвечает за обработку доставляемых данных.

... и теперь мы получаем то, что я 'Я пытался сказать все это время. Люди решают, какое программное обеспечение они будут писать.Существуют МНОГИЕ различных реализаций HTTP-серверов (две "стандартные" версии - Microsoft и Apache - но если вы не знаете об этом, посмотрите, что сообщество Node.JS может сделать с помощью HTTPреализации сервера. Вероятно, сейчас существуют тысячи различных пользовательских реализаций HTTP-сервера.)

Зная все этого, я попрошу вас КАК это будет ВОЗМОЖНО ограничить GET-запрос от добавления / изменения данных?Уровень IP, смотрящий на данные, основанный на порте и не разрешающий тело для запросов GET?Я могу подумать о двух «обходных путях» прямо в голове - добавить контент в URL или добавить контент в cookie.

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

...