2016-05-04 8 views
8

Gibt es eine Möglichkeit, einen Bereich von ALLOWED_HOSTS IPs in Django zu setzen?Django ALLOWED_HOSTS IP-Bereich

Etwas wie folgt aus:

ALLOWED_HOSTS = ['172.17.*.*'] 
+1

Ich wollte mit "Ja" antworten, aber hat etwas Google graben gemacht und kann kein spezifisches Beispiel finden, wo jemand das getan hat. Nach den [docs] (https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts) können Sie einen einzelnen Platzhalter in der Liste verwenden, wie 'ALLOWED_HOSTS = ['*'] ', (was aus Sicherheitsgründen nicht empfohlen wird), aber ich habe noch nichts wie Ihr Beispiel gesehen. Ich stehe immer noch auf "Ja", aber ich werde nicht überzeugt sein, bis ich eine Referenz sehe, die dies explizit ausspricht. Das mag eine dumme Frage sein, aber hast du es versucht, um zu sehen, ob es irgendwelche Fehler im Django auslösen wird? – Nez

+0

Es wäre besser, dies auf einen Webserver zu übertragen, der dafür eingerichtet wurde, dies effizient zu handhaben. Oder vielleicht sogar Firewall-Regeln, je höher im Stack ein Traffic gefiltert werden könnte, desto besser. – serg

+0

@ Nez, ja ich tue. Schau dir meine Antwort unten an. Ich habe eine Lösung für dieses Problem gefunden. –

Antwort

7

ich auf Django ein Ticket gebucht jedoch wurde ich gezeigt, dass dies wie folgt an

from socket import gethostname, gethostbyname 
ALLOWED_HOSTS = [ gethostname(), gethostbyname(gethostname()), ] 

https://code.djangoproject.com/ticket/27485

+0

Das Fall-Ersteller-Update für Windows 10 hat diese Methode für mich kaputt gemacht, da 'gethostname() 'stattdessen die Hyper-V-Ethernet-Switch-Adresse zurückgegeben hat. Sie können stattdessen 'ALLOWED_HOSTS = [gethostname(),] + gethostbyname_ex (gethostname()) [2]' verwenden. –

4

Nein, das ist derzeit nicht möglich. Nach the docs wird die folgende Syntax unterstützt:

['www.example.com'] # Fully qualified domain 
['.example.com'] # Subdomain wildcard, matches example.com and www.example.com 
['*'] # Matches anything 

Wenn Sie bei der Durchführung des Verfahrens validate_host anschaut, kann man sehen, dass * als Platzhalter verwendet wird nicht unterstützt.

+0

Aha, danke. Ich habe nicht hart genug gesucht, um den Code selbst durchzulesen. – Nez

2

ich gefunden habe, eine solche Lösung für das Filtern Bereich von IP-Adressen:

https://stackoverflow.com/a/36222755/3766751

Mit diesem Ansatz wir IPs mit irgendwelchen Mitteln (F. E. mit regex) filtern.

from django.http import HttpResponseForbidden 

class FilterHostMiddleware(object): 

    def process_request(self, request): 

     allowed_hosts = ['127.0.0.1', 'localhost'] # specify complete host names here 
     host = request.META.get('HTTP_HOST') 

     if host[len(host)-10:] == 'dyndns.org': # if the host ends with dyndns.org then add to the allowed hosts 
      allowed_hosts.append(host) 
     elif host[:7] == '192.168': # if the host starts with 192.168 then add to the allowed hosts 
      allowed_hosts.append(host) 

     if host not in allowed_hosts: 
      raise HttpResponseForbidden 

     return None 

Vielen Dank für @Zorgmorduk

1

Hier ist eine kurze erreicht werden konnte und schmutzige Lösung.

allowed_hosts + = [ '172,17.% S.% S' % (i, j) für i in range (256) für j in range (256)]

Verwandte Themen