[PYTHON] Beim Zugriff von Andorid Chrome schlägt die Django CSRF-Überprüfung fehl oder Sie können sich nicht anmelden.

Umgebung

Django 1.9 Android Chrome (wahrscheinlich Dolphin)

Phänomen

Wenn ich mit Chrome unter Android auf das Anmeldeformular von Django zugreife, wird ein CSRF-Fehler (403) angezeigt und ich kann mich nicht anmelden.

Die Meldung "CSRF-Cookie nicht gesetzt" verbleibt im Django-Protokoll.

Überblick

Wahrscheinlich enthält das Anforderungscookie Multibyte und wird an den Server gesendet.

In meinem Fall enthielt das von Google Analytics eingegebene Cookie "__utmz" Japanisch, was ein Problem verursachte.

Django empfängt es und analysiert es mit dem regulären Ausdruck "http.cookies._CookiePattern" des Cookie-Parsers "http.cookies" in der http-Bibliothek von Python. Das Muster für reguläre Ausdrücke wird jedoch als "re.ASCII" in "flags" angegeben. Da dies geschehen ist, scheint das Parsen an der Stelle zu enden, an der das Multi-Byte angezeigt wird.

Korrespondenz

Ich habe die WSGIRequest COOKIES gepatcht. Ich habe versucht, URL-Codierung Multibyte.

def patch_wsgi_request():
    """
Wenn der Cookie Japanisch enthält, schlägt die Cookie-Analyse fehl.
URL-Codierung vor dem Parsen
    Android +Wird häufig in Google Analytics verwendet
    __Japanisch wird in utmz eingegeben
    """
    import re
    from urllib.parse import quote
    from django.core.handlers.wsgi import WSGIRequest
    from django import http
    from django.core.handlers.wsgi import get_str_from_wsgi
    from django.utils.functional import cached_property

    def _quote(s):
        return quote(s.group(0))

    def COOKIES(self):
        raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '')
        re_multibyte = re.compile(r'[^\x00-\x7F]+')
        raw_cookie_fixed = re_multibyte.sub(_quote, raw_cookie)
        return http.parse_cookie(raw_cookie_fixed)

    setattr(WSGIRequest, 'COOKIES', cached_property(COOKIES))

patch_wsgi_request()

Führen Sie diesen Code irgendwo aus (z. B. den Auswertungszeitpunkt von urls.py).

Recommended Posts

Beim Zugriff von Andorid Chrome schlägt die Django CSRF-Überprüfung fehl oder Sie können sich nicht anmelden.
CSRF-Validierungsfehler beim Zugriff auf die Django 3.0-Administrationsseite in Chrome
Wenn base.html in Django nicht aufgerufen werden kann
Fehlermeldung anzeigen, wenn die Anmeldung in Django fehlschlägt