РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
516 of 818 menu

Исключение DisallowedRedirect

Исключение DisallowedRedirect наследуется от SuspiciousOperation и возникает в Django, когда выполняется попытка перенаправления на URL-адрес, который не разрешен политикой безопасности. Это исключение используется для предотвращения открытых редиректов, которые могут быть использованы злоумышленниками для фишинговых атак. Обычно оно возникает при работе с функцией redirect или при проверке URL-адресов через утилиты безопасности Django, если перенаправление ведет на внешний домен, не указанный в настройках ALLOWED_HOSTS.

Исключение автоматически вызывается внутренними механизмами Django при обнаружении небезопасного редиректа. Разработчик может явно обрабатывать это исключение с помощью конструкции try/except для управления поведением приложения в таких случаях.

Синтаксис

from django.core.exceptions import DisallowedRedirect raise DisallowedRedirect("Custom error message")

Пример

Рассмотрим пример, когда происходит попытка перенаправления на внешний URL-адрес, не входящий в список разрешенных хостов:

from django.shortcuts import redirect from django.core.exceptions import DisallowedRedirect from django.http import HttpResponse def redirect_view(request): try: # Попытка перенаправить на внешний сайт return redirect("https://malicious-site.com") except DisallowedRedirect as e: return HttpResponse(f"Redirect blocked: {e}")

Результат выполнения кода:

"Redirect blocked: [DisallowedRedirect]"

Пример

Пример явного вызова исключения при проверке URL-адреса на безопасность:

from django.core.exceptions import DisallowedRedirect from django.urls import resolve def validate_redirect_url(url): allowed_domains = ["example.com", "mysite.com"] # Проверяем, является ли URL внутренним if not any(domain in url for domain in allowed_domains): raise DisallowedRedirect(f"URL {url} is not allowed for redirect") return resolve(url) # Использование функции try: validate_redirect_url("https://external-site.com") except DisallowedRedirect as e: print(f"Error: {e}")

Результат выполнения кода:

"Error: URL https://external-site.com is not allowed for redirect"

Пример

Пример обработки исключения при работе с перенаправлением после аутентификации:

from django.shortcuts import redirect from django.core.exceptions import DisallowedRedirect from django.http import HttpResponseRedirect def login_success_view(request): next_url = request.GET.get("next", "/") try: # Проверяем, является ли URL безопасным if next_url.startswith("http://") or next_url.startswith("https://"): if "example.com" not in next_url: raise DisallowedRedirect("External redirect not allowed") return HttpResponseRedirect(next_url) except DisallowedRedirect as e: # Перенаправляем на безопасную страницу в случае ошибки return redirect("/dashboard/")

Результат выполнения кода при попытке внешнего редиректа:

"Redirect to /dashboard/"

Смотрите также

  • исключение DisallowedHost,
    которое возникает при запросе с неразрешенным хостом
  • исключение SuspiciousOperation,
    базовое исключение для подозрительных операций
  • исключение SuspiciousFileOperation,
    которое возникает при подозрительных операциях с файлами
  • исключение BadHeaderError,
    которое возникает при недопустимых заголовках HTTP
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить