2015-07-08 8 views
5

Kontext: Ich habe eine Django App geschrieben, die ich jetzt in Elastic Beanstalk (AWS) bereitgestellt habe.Benutzerdefinierte Header fehlen in Anfragen an Django

In der lokalen Entwicklung habe ich eine benutzerdefinierte Anfrage Header SESSION_TOKEN, die ich dann mit request.META.get('HTTP_SESSION_TOKEN') zugreifen kann. In der Produktion sehe ich Fehler, weil dieser Header nicht erreichbar ist (aka fehlt er einfach in allen Anfragen, die mein Django-Server sieht).

Zusätzlich funktionieren meine anderen Standard-Header, es ist nur der benutzerdefinierte Header, der fehlt. Hinweis: Ich setze keine HTTP_AUTHORIZATION, dies ist nicht das gleiche Problem wie Authorization header missing in django rest_framework, is apache to blame?.

Was läuft falsch? Wie kann ich auf benutzerdefinierte Header in meinem Backend in der Produktion zugreifen?

Antwort

12

Am wahrscheinlichsten SESSION_TOKEN Header wird von etwas abgestreift. Von Django security advisory:

Wenn HTTP-Header in die WSGI environ platziert sind, werden sie durch die Umwandlung normalisiert werden in Großbuchstaben, alle Striche zu Unterstrichen Konvertieren und das Voranstellen HTTP_. Zum Beispiel würde ein Header X-Auth-User in der WSGI-Umgebung (und somit auch in Djangos request.META-Dictionary) zu HTTP_X_AUTH_USER werden.

Leider bedeutet dies, dass die WSGI-Umgebung nicht zwischen Headern mit Bindestrichen und Headern mit Unterstrichen unterscheiden kann: X-Auth-User und X-Auth_User werden beide zu HTTP_X_AUTH_USER. Dies bedeutet, dass wenn ein Header auf eine sicherheitsempfindliche Weise verwendet wird (z. B. indem Authentifizierungsinformationen von einem Front-End-Proxy weitergeleitet werden), auch wenn der Proxy einen eingehenden Wert für X-Auth-User sorgfältig entfernt, ein Angreifer möglicherweise kann einen X-Auth_User-Header (mit Unterstrich) bereitstellen und diesen Schutz umgehen.

und das wichtigste Bit an Information:

Um solche Angriffe zu verhindern, sowohl Nginx und Apache 2.4+ alle Header abstreifen Unterstrichen von eingehenden Anfragen standardmäßig enthalten. Der integrierte Entwicklungsserver von Django funktioniert jetzt genauso. Der Entwicklungsserver von Django wird nicht für den produktiven Einsatz empfohlen, aber die Anpassung an das Verhalten von herkömmlichen Produktionsservern verringert die Oberfläche für Verhaltensänderungen während der Bereitstellung.

Wenn Sie benutzerdefinierte Header haben, sollten Sie stattdessen Bindestrich verwenden.

+0

Das Setzen des Headers in meinen Anfragen an 'Session-Token' und das Auslesen als' HTTP_SESSION_TOKEN' löste das Problem. Vielen Dank! – owencm

+0

aus irgendeinem Grund verwenden Sie nicht Standard-Django-Session-App, die ein Cookie anstelle von Kopfzeilen verwendet, um Sitzungs-ID herum zu übergeben. Das scheint sicherer zu sein, da Sie angeben können, das Cookie nur in sicheren Verbindungen zu verwenden (nicht 100% ig, aber zumindest etwas) – miki725

+0

Ursprünglich verwendete ich Django als API-Backend für eine native App, also war dies offensichtlich etwas zu tun. Ich habe seitdem einen Webclient erstellt, war aber besorgt über CSRF-Probleme mit Cookies und mein aktueller Ansatz funktionierte gut, also behielt ich ihn :) – owencm