Запрос GET незначительно менее защищен, чем запрос POST. Ни один не предлагает истинную «безопасность» сам по себе; использование POST-запросов не сможет магически обезопасить ваш сайт от злонамеренных атак на заметную сумму. Тем не менее, использование запросов GET может сделать безопасным приложение в противном случае.
Мантра о том, что вы «не должны использовать GET-запросы для внесения изменений», все еще очень верна, но это не имеет ничего общего с вредоносным поведением. Формы входа наиболее чувствительны к отправке с использованием неправильного типа запроса.
Поиск пауков и веб-ускорителей
Это реальная причина, по которой вам следует использовать POST-запросы для изменения данных. Поисковые пауки будут переходить по каждой ссылке на вашем сайте, но не будут отправлять найденные ими случайные формы.
Веб-ускорители хуже, чем поисковые пауки, потому что они работают на компьютере клиента и «щелкают» по всем ссылкам в контексте зарегистрированного пользователя . Таким образом, приложение, использующее запрос GET для удаления содержимого, даже если для этого требуется администратор, с радостью выполнит приказы (не вредоносного!) Веб-ускорителя и удалит все, что увидит .
спутанная атака депутата
A запутанная атака депутата (где заместитель - браузер) возможна независимо от того, используете ли вы запрос GET или POST .
На веб-сайтах, контролируемых злоумышленниками, GET и POST одинаково просты для отправки 1030 * без взаимодействия с пользователем .
Единственный сценарий, в котором POST немного менее восприимчив, заключается в том, что многие веб-сайты, которые не находятся под контролем злоумышленника (например, сторонний форум), позволяют встраивать произвольные изображения (позволяя злоумышленнику вводить произвольный запрос GET), но запретите все способы введения произвольного запроса POST, будь то автоматический или ручной.
Можно утверждать, что веб-ускорители являются примером запутанной атаки депутатов, но это только вопрос определения. Во всяком случае, злонамеренный злоумышленник не может контролировать это, так что вряд ли это будет атака , даже если заместитель растерян.
Журналы прокси
Прокси-серверы, скорее всего, будут регистрировать GET URL полностью, без удаления строки запроса. Параметры запроса POST обычно не регистрируются. Куки вряд ли будут зарегистрированы в любом случае. (пример)
Это очень слабый аргумент в пользу POST. Во-первых, незашифрованный трафик может быть зарегистрирован полностью; у вредоносного прокси уже есть все, что нужно. Во-вторых, параметры запроса имеют ограниченное применение для злоумышленника: что им действительно нужно, так это файлы cookie, поэтому, если у них есть только логи прокси, они вряд ли смогут атаковать либо GET, либо POST URL.
Существует одно исключение для запросов на вход в систему: они, как правило, содержат пароль пользователя. Сохранение этого в журнале прокси открывает вектор атаки, который отсутствует в случае POST. Однако вход по обычному HTTP в любом случае небезопасен.
Кэш прокси
Кэширующие прокси могут сохранять ответы GET, но не ответы POST. Тем не менее, ответы GET можно сделать не кэшируемыми с меньшими усилиями, чем преобразование URL-адреса в обработчик POST.
HTTP "Referer"
Если пользователь должен был перейти на сторонний веб-сайт со страницы, обслуживаемой в ответ на запрос GET, этот сторонний веб-сайт получает доступ ко всем параметрам запроса GET.
Относится к категории «показывает параметры запроса третьей стороне», чья серьезность зависит от того, что присутствует в этих параметрах. POST-запросы, естественно, защищены от этого, однако для использования GET-запроса хакеру потребуется вставить ссылку на свой веб-сайт в ответ сервера.
История браузера
Этоочень похоже на аргумент «proxy logs»: запросы GET хранятся в истории браузера вместе с их параметрами. Атакующий может легко получить их, если у них есть физический доступ к машине.
Действие обновления браузера
Браузер будет повторять запрос GET, как только пользователь нажмет кнопку «обновить». Это может быть сделано при восстановлении вкладок после завершения работы. Таким образом, любое действие (скажем, платеж) будет повторяться без предупреждения.
Браузер не будет повторять запрос POST без предупреждения.
Это хорошая причина использовать только POST-запросы для изменения данных, но не имеет ничего общего со злонамеренным поведением и, следовательно, с безопасностью.
Так что мне делать?
- Используйте только POST-запросы для изменения данных, в основном по причинам, не связанным с безопасностью.
- Использовать только POST-запросы для форм входа в систему; в противном случае вводятся векторы атаки.
- Если ваш сайт выполняет конфиденциальные операции, вам действительно нужен кто-то, кто знает, что они делают, потому что это не может быть рассмотрено в одном ответе. Вам нужно использовать HTTPS, HSTS, CSP, уменьшить внедрение SQL, внедрение сценария (XSS) , CSRF и множество других вещей, которые могут быть характерны для вашей платформы (например, Уязвимость массового назначения в различных средах: ASP.NET MVC , Ruby on Rails и т. д.). Нет единой вещи, которая будет отличать «безопасный» (не эксплуатируемый) и «не безопасный».
По протоколу HTTPS данные POST кодируются, но могут ли URL-адреса быть прослушаны третьей стороной?
Нет, их нельзя понюхать. Но URL-адреса будут храниться в истории браузера.
Было бы справедливо сказать, что лучшая практика состоит в том, чтобы избегать возможного помещения конфиденциальных данных в POST или GET вообще и использования кода на стороне сервера для обработки конфиденциальной информации вместо этого?
Зависит от того, насколько оно чувствительно или, более конкретно, каким образом. Очевидно, клиент увидит это. Любой, кто имеет физический доступ к компьютеру клиента, увидит его. Клиент может подделать его при отправке обратно к вам. Если это имеет значение, тогда да, храните конфиденциальные данные на сервере и не позволяйте им уйти.