Как обработать CSRF для iFrames в Django с несколькими белыми сайтами без использования белого списка доменов?
Я создаю решение whitelabel с использованием Django, где мои клиенты могут встраивать формы из моего приложения на свои сайты с помощью iFrames. Однако я столкнулся с проблемой защиты CSRF, когда форма отправляется с этих внешних сайтов, что приводит к ошибке 403 Forbidden из-за "CSRF verification failed."
Моя установка:
**Framework: ** Django 4.x с включенной защитой CSRF. Use Case: Несколько клиентов встраивают нашу форму (созданную с помощью шаблонов Django) на свои сайты. Пользователи отправляют форму с этих внешних доменов.
Проблема: Поскольку маркер CSRF полагается на куки и кросс-оригинальные политики, маркер CSRF не включается в отправляемую форму, что приводит к сбою проверки.
Ограничения:
Отсутствие вызовов API: Форма отображается на стороне сервера с помощью шаблонов Django, и мы не используем фронтенд-фреймворки вроде React или Vue, поэтому решения на основе API не подходят. Динамическое встраивание: Не существует фиксированного количества клиентских сайтов, которые могут использовать форму, поэтому ведение белого списка доменов для исключения CSRF не является масштабируемым. Безопасность: Я все еще хочу поддерживать защиту от CSRF в целях безопасности.
Что я пробовал:
Отключение CSRF Middleware: Работает, но это ставит под угрозу безопасность, поэтому не является жизнеспособным долгосрочным решением. Установка CSRF_COOKIE_SAMESITE в значение None: Нет эффекта из-за ограничений кросс-оригинальности. Разрешение CORS: Не решило проблему, так как не применяется к проверке токенов CSRF. Задача: Мне нужно масштабируемое решение, которое позволит формам, встроенным в iFrame с любого клиентского сайта, безопасно проходить проверку CSRF. Поскольку мы не можем предсказать, какие домены будут использовать форму, ведение списка разрешенных доменов нецелесообразно. Решение должно безопасно обрабатывать CSRF без необходимости вручную вносить каждый клиентский домен в белый список.
Вопросы:
Есть ли способ динамически передавать CSRF-токены или иным образом управлять кросс-оригинальной CSRF-защитой для iFrames в Django?
Как мы можем безопасно обрабатывать CSRF для неограниченного количества сайтов-клиентов встраивания, не поддерживая белый список доменов?
Существуют ли какие-либо конфигурации Django или промежуточные решения, предназначенные для такого типа использования? Любые соображения или рекомендации будут высоко оценены!