Django 1.9 Android Chrome (probablement Dolphin)
Lorsque j'accède au formulaire de connexion de Django avec Chrome sur Android, j'obtiens une erreur CSRF (403) et je ne peux pas me connecter.
Le message "CSRF cookie not set." Reste dans le journal Django.
Le cookie de demande contient probablement plusieurs octets et est envoyé au serveur.
Dans mon cas, le cookie __utmz
que Google Analytics a inséré contenait du japonais, ce qui a causé un problème.
Django le reçoit et l'analyse avec l'expression régulière http.cookies._CookiePattern
de l'analyseur de cookies http.cookies
dans la bibliothèque http de Python, mais le modèle d'expression régulière est spécifié comme re.ASCII
dans flags
. Depuis que cela a été fait, il semble que l'analyse se termine à l'endroit où le multi-octet apparaît.
J'ai patché les COOKIES WSGIRequest. J'ai essayé le codage d'URL multi-octets.
def patch_wsgi_request():
"""
Si le cookie contient du japonais, l'analyse des cookies échouera.
Encodage de l'URL avant l'analyse
Android +Fréquemment utilisé dans Google Analytics
__Le japonais est entré en utmz
"""
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()
Exécutez ce code quelque part (comme le calendrier d'évaluation de urls.py)
Recommended Posts