Django 1.9 Android Chrome (wahrscheinlich Dolphin)
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.
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.
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