[PYTHON] Mesures à prendre en cas d'opération suspecte dans la redirection HttpResponse

Si vous essayez de rediriger vers autre chose que http [s] ou ftp en utilisant HttpResponseRedirect, vous obtiendrez une exception SuspiciousOperation comme indiqué ci-dessous.

SuspiciousOperation: Unsafe redirect to URL with protocol 'com.example.app.sample0'

Vous pouvez contourner cette exception en ajoutant un code comme celui-ci: Vous pouvez ajouter une destination de redirection à allowed_schemes que vous ne souhaitez pas lever d'exception.

try:
    from django.http.response import HttpResponseRedirectBase
        HttpResponseRedirectBase.allowed_schemes += ['com.example.app.sample0', ]
except ImportError:
    pass

En ce qui concerne l'importation, dans l'ancienne version, django.http et les versions antérieures n'étaient pas divisées en réponse et requête. Ainsi, lorsque la version de Django est ancienne (environ la série 1.4 ou antérieure, j'ai oublié la version détaillée), l'importation est le code suivant.

from django.http import HttpResponseRedirectBase

S'il se trouve dans la plage des pages Web qui sont normalement affichées avec un navigateur, il est peu probable que vous souhaitiez passer à une destination de redirection autre que http [s] et ftp. Par exemple, lorsque vous ciblez une application pour smartphone, vous souhaitez rediriger vers "[nom du package d'application]: //" (exemple: lors du renvoi du contrôle de l'URL d'authentification vers l'application avec OAuth), etc.


Supplément

Cette exception lors de la redirection a été introduite dans la série Django 1.4.

Le code réel de HttpResponseRedirectBase est le suivant, et il est facile de voir que la destination de la redirection doit être ajoutée à allowed_schemes. Étant donné que le code a été introduit comme mesure de sécurité, il est préférable de limiter la destination de redirection autant que possible comme dans l'exemple ci-dessus.

response.py


class HttpResponseRedirectBase(HttpResponse):
    allowed_schemes = ['http', 'https', 'ftp']

    def __init__(self, redirect_to, *args, **kwargs):
        parsed = urlparse(redirect_to)
        if parsed.scheme and parsed.scheme not in self.allowed_schemes:
            raise SuspiciousOperation("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)
        super(HttpResponseRedirectBase, self).__init__(*args, **kwargs)
        self['Location'] = iri_to_uri(redirect_to)

    url = property(lambda self: self['Location'])

Recommended Posts

Mesures à prendre en cas d'opération suspecte dans la redirection HttpResponse
Mesures à prendre lorsque "Impossible d'ouvrir l'affichage" s'affiche dans X11 Forward
Mesures à prendre en cas de caractères déformés lors de la tentative de redirection / canalisation du résultat de aws-cli
Que faire si ʻObject arrays ne peut pas être chargé quand allow_pickle = False` se produit dans numpy.load ()
Enregistrement des actions à entreprendre lorsque google_image_download ne peut pas être utilisé
Acquérir automatiquement le journal des opérations dans le terminal lors de la connexion à Linux
[Note] Éléments à vérifier lorsqu'une boucle infinie se produit dans pyenv
Que faire quand UnicodeDecodeError se produit pendant read_csv dans pandas (pd.read_table ())
Que faire lorsque ModuleNotFoundError: Aucun module nommé'XXX 'ne se produit en Python
[OSX] [pyenv] Que faire lorsqu'une erreur SSL se produit dans pip