Может ли запрос HTTP GET на веб-сервис REST быть безопасным? - PullRequest
0 голосов
/ 23 мая 2019

В настоящее время я работаю над новой веб-службой REST, разработанной в Django REST Framework, и при определении URL-адресов у меня возникли сомнения относительно ее безопасности. Следуя стандартам, которые определили метод GET для списка данных из базы данных, я не понимаю, может ли это быть безопасным методом для получения данных.

Представьте себе такую ​​ситуацию:

Я получаю доступ к URL-адресу / пациентов , определенному для возврата списка пациентов. Этот список не является общедоступным и может быть запрошен только авторизованными пользователями. Поскольку не все пользователи могут видеть всех пациентов, я создаю код хэш , который работает как ключ, позволяющий составить список пациентов для этого конкретного пользователя. Если хеш-код не предоставлен, метод возвращает запрет 403.

Это работает примерно так: / пациентов / HASHCODE

Поскольку мой хеш-код является запросом в URL, а не внутри тела HTTP-сообщения, как это было бы, если бы это было сделано методом POST, это выглядит небезопасным для меня. Я знаю, что SSL может скрывать некоторую информацию о запросах, но не о GET-запросе. И, конечно же, этот хэш не должен быть виден никому.

Могу ли я сказать, что это безопасный способ доступа к моему API? Если нет, то как мне это реализовать?

1 Ответ

3 голосов
/ 23 мая 2019

Прежде всего, вы должны использовать HTTPS, поскольку он гарантирует, что оба заголовка body и будут зашифрованы. Выберите сертификат, выданный центром сертификации, и держитесь подальше от самозаверяющих сертификатов.


Если то, что вы называете хеш , означает маркер доступа , то оно относится к заголовку Authorization со схемой аутентификации Bearer (см. это ответ для деталей). В качестве альтернативы вы можете использовать cookie с установленными флагами HttpOnly и Secure.

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


Любая конфиденциальная информация (например, учетные данные, токены доступа, вы называете ее) должна никогда отправляться в URL: Запрошенный URL может регистрироваться серверами и прокси; Если URL запрашивается браузером, он попадает в историю браузера. Вы наверняка хотите избежать этого.

GET предназначен для извлечения данных, в то время как POST является своего рода перехватом всего глагола , то есть представление, отправленное в полезной нагрузке, будет обрабатываться в соответствии с собственной специфической семантикой ресурса). Если вам нужно отправить конфиденциальную информацию на сервер, я бы посоветовал вам использовать POST, отправляя любые конфиденциальные данные в полезную нагрузку, которые будут зашифрованы по HTTPS.

...