Запрос GET немного менее безопасен, чем запрос POST. Ни один не предлагает истинную «безопасность» сам по себе; использование запросов POST не сделает ваш сайт защищенным от злонамеренных атак на заметную сумму. Однако использование запросов GET может сделать в противном случае безопасное приложение небезопасным.
Мантра о том, что вы «не должны использовать GET-запросы для внесения изменений», все еще очень верна, но это не имеет ничего общего со злонамеренным поведением. Формы входа наиболее чувствительны к отправке с использованием неправильного типа запроса.
Поисковые пауки и веб-ускорители
Это реальная причина, по которой вы должны использовать POST-запросы для изменения данных. Поисковые пауки будут переходить по каждой ссылке на вашем сайте, но не будут отправлять случайные формы, которые они найдут.
Веб-ускорители хуже поисковых пауков, потому что они работают на компьютере клиента и «кликают» по всем ссылкам в контексте вошедшего в систему пользователя . Таким образом, приложение, которое использует GET-запрос для удаления содержимого, даже если для этого требуется администратор, с радостью выполнит указания (не вредоносного!) Веб-ускорителя и удалит все, что увидит .
Запутанная депутатская атака
Запутаться заместитель атаки (где депутат браузер) является возможным , независимо от того, используется ли GET или POST - запрос .
На контролируемых злоумышленниками сайтах GET и POST одинаково легко отправлять без участия пользователя .
Единственный сценарий, в котором 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 в целом и использования кода на стороне сервера для обработки конфиденциальной информации?
Зависит от того, насколько оно чувствительно или, более конкретно, каким образом. Очевидно, клиент увидит это. Любой, кто имеет физический доступ к компьютеру клиента, увидит его. Клиент может подделать его при отправке обратно к вам. Если это имеет значение, тогда да, храните конфиденциальные данные на сервере и не позволяйте им уйти.