Вот как вы бы реализовали безопасное перенаправление:
from django.utils.http import url_has_allowed_host_and_scheme
from django.utils.encoding import iri_to_uri
from django.shortcuts import redirect
def example_view(request):
if url_has_allowed_host_and_scheme(request.GET['next'], None):
url = iri_to_uri(request.GET['next'])
return redirect(url)
else:
raise
Часть iri_to_uri
необходима для того, чтобы убедиться, что URL-адрес конечного результата указан правильно. Например:
Первая строка в HTTP-запросе должна быть в таком формате:
GET /caf%C3%A9/ HTTP/1.0
URL должен быть экранирован, так как он нарушил бы протокол HTTP, если бы он содержал что-то вроде пробелов.
Если честно, я все еще не совсем уверен, зачем нужен iri_to_uri
, потому что утилиты Django, такие как redirect
, будут автоматически при необходимости экранируйте URL-адрес, прежде чем он попадет в провод в HTTP-запросе.