[PYTHON] Lors de l'accès à partir d'Andorid Chrome, la vérification Django CSRF échoue ou vous ne pouvez pas vous connecter.

environnement

Django 1.9 Android Chrome (probablement Dolphin)

phénomène

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.

Aperçu

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.

Correspondance

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

Lors de l'accès à partir d'Andorid Chrome, la vérification Django CSRF échoue ou vous ne pouvez pas vous connecter.
Erreur de validation CSRF lors de l'accès à la page d'administration de django 3.0 dans Chrome
Lorsque base.html ne peut pas être appelé dans Django
Afficher un message d'erreur lorsque la connexion échoue dans Django