2016-02-24 6 views
3

Мой файл settings.py содержит:Джанго allowed_hosts не работает

DEBUG = False 
ALLOWED_HOSTS = [u'mydomainxxx.com'] 

Howevever, я могу уволить локон запрос так: curl -X GET https://mydomainxxx.com/api/ -H 'Authorization: Token some token' и я получаю ответ.

Я надеялся, что использование ALLOWED_HOSTS предотвратит такие команды, как curl, чтобы получить ответ от моего API. Это нормальное поведение?

+0

Вы отладка включены? –

+0

Как упоминалось выше, это False –

ответ

1

Только для тех, кто хотел бы, чтобы фильтровать по ссылающейся URL, а не на IP-адрес, мы можем использовать следующий промежуточные программное обеспечение:

from django.conf import settings 
from django import http 

class AllowHostsMiddleware(object): 

    def process_request(self, request): 
     referer_url = request.META.get('HTTP_REFERER','') 
     if referer_url.startswith(settings.ALLOWED_REFERER_URL): 
      return None 
     return http.HttpResponseForbidden('<h1>Forbidden</h1>') 
5

Вы вводите в заблуждение установку ALLOWED_HOSTS с чем-то еще. Он обозначает имена хостов, которые ваш сервер будет слушать; а не имена хостов для подключения хостов. Существует встроенный метод предотвращения этого, но вы можете легко написать промежуточное программное обеспечение для проверки соединения имен хостов.

текущие настройки предотвратит это получить ответ:

curl -X GET http://another_domainxxx.com/api/ -H 'Authorization: Token some token' 

даже если оба mydomainxxx.com и another_domainxxx.com будет решать тот же IP-адрес.

+0

Спасибо Selcuk, не могли бы вы указать мне хороший ресурс, откуда я могу написать это промежуточное программное обеспечение? –

+1

@SaurabhVerma Если вы хотите ограничить свой IP-адрес, вы можете попробовать https://github.com/muccg/django-iprestrict/ или изменить его для ограничения в соответствии с именем хоста. – Selcuk

+0

Спасибо, я также добавил свой ответ, который работал для меня. –

-1

В дополнение к ответу Сельджука. Я думаю, вы можете сделать это, используя запрос CORS Origin. Проверьте https://github.com/ottoyiu/django-cors-headers. Вы найдете CORS_ORIGIN_WHITELIST параметр, который определяет список имен хостов происхождения, которым разрешено делать HTTP-запрос межсайтовой связи.

+2

HTTP-запросы кросс-сайтов предназначены только для клиентов (браузеров). Они не применяются к серверным запросам, таким как завиток. – Selcuk

+0

Да, я согласен, если это не указано в curl как происхождение, подобное этому http://stackoverflow.com/a/12179364/4117381 –

+1

Вы должны прочитать больше о CORS, но в двух словах ваша ссылка предназначена для отладки браузеров (Javascript) , Он _imulate_ запрос на кросс-сайт, который не является точкой OP. – Selcuk

Смежные вопросы