Django Rest + React + Flutter: как ограничить доменное происхождение запросов
В настоящее время я создаю веб-приложение + мобильное приложение.
Мой front end разработан с использованием React и Axios (для запросов вызовов API). Он обслуживается непосредственно vercel на сайте mydomain.com
Мое мобильное приложение разработано с использованием Flutter
Мой back end разработан с использованием Django и Django Rest. Она обслуживается с помощью apache2 на api.mydomain.com. Он обслуживает только конечные точки API.
Таким образом, фронтенд, мобильное приложение и бэкенд разделены.
Я хочу, чтобы только мой front-end (mydomain.com) и приложение flutter могли делать API запросы к моему Django Rest backend. Я хотел бы предотвратить любые другие домены, любые клиенты, такие как postman, insomnia, curl, или любой скрипт, чтобы сделать API запросы к моему бэкенду.
Я уже установил CORS в Django Rest. Однако я все еще могу делать запросы к бэкенду с помощью curl или любого другого клиента.
У вас есть идеи, что я могу сделать, чтобы достичь этого?
Заранее большое спасибо за ваши ответы.
CORS
применяется только веб-браузерами для предотвращения утечки информации на несвязанные страницы, которые могут ее запросить. Вам нужен какой-то контроль доступа, либо аутентификация вызывающей стороны, либо ограничение доступа к конечной точке.
Проверка заголовка Host с помощью get_host()
может обеспечить достаточную защиту, в зависимости от настроек вашего сервера.
get_host()
сообщит вам значение заголовка Host
в запросе, который представляет собой данные, предоставляемые клиентом, поэтому им можно манипулировать любым способом. Заголовок Host
является неотъемлемой частью HTTP 1.1
, позволяя размещать несколько доменов на одном адресе, поэтому вы можете рассчитывать на то, что ваш сервер будет отклонять запросы, приходящие не с localhost с соответствующим заголовком, но трудно быть уверенным.
Вероятно, надежнее было бы проверять сетевой адрес клиента и отклонять запросы от всех клиентов, кроме тех, которые специально разрешены. Проверьте и этот вопрос.