
Django-Apps verlassen sich für bestimmte Links usw. auf den Host-Header. In meinem Setup läuft eine Django-App hinter Nginx als Reverse-Proxy (mit einem nicht standardmäßigen server_name
).
Entsprechend:
https://docs.djangoproject.com/en/3.1/topics/security/#host-header-validation
Selbst wenn Apache beispielsweise so konfiguriert ist, dass Ihre Django-Site von einem nicht standardmäßigen virtuellen Host mit festgelegtem ServerName bedient wird, ist es dennoch möglich, dass eine HTTP-Anforderung mit diesem virtuellen Host übereinstimmt und einen gefälschten Host-Header liefert.
Ich konnte keine Informationen darüber finden, ob und wie dies in Nginx möglich ist.
Ist es wirklich unsicher, in der Webanwendung blind zuzulassen, dass der Header von Nginx stammt?
Antwort1
Um den Header an die Reverse-Proxy-App weiterzuleiten , fügen Sie Ihrem / -Block Host:
Folgendes hinzu :server
location
proxy_set_header Host $host;
Welche Werte $host
letztendlich möglich sind, hängt von der Konfiguration des virtuellen Nginx-Hosts ab.
Wenn Ihr server
Block ein Block ist default_server
, bedeutet dies, dass der Serverblock alle an einen virtuellen Host gesendeten Anfragen verarbeitet. In diesem Fall wird der Wert des Host
Headers an den Upstream-Server weitergegeben.
Um dies in diesem default_server
Szenario zu verhindern, verwenden Sie diese Version:
proxy_set_header Host example.com;
wo example.com
ist Ihr Domänenname.
Noch besser ist es, Nginx richtig zu konfigurieren, sodass default_server
der Block beispielsweise immer 404 zurückgibt und ein geeigneter virtueller Host mit dem richtigen Namen verwendet wird.