Django 4中如何配置CSRF_TRUSTED_ORIGINS允许任意IP访问?
解决Django 4.x中无法预设所有CSRF可信来源的问题
问题背景
将Angular/Django Web应用从Django 2.x升级到4.x后,应用需打包分发给用户部署在任意主机、域名和端口上,用户通过HTTP://whereAppIsInstalled:PORT访问。在Django 2.x中仅需以下设置即可正常运行:
ALLOWED_HOSTS = ['*',] CORS_ORIGIN_ALLOW_ALL = True
但Django 4.x要求配置CSRF_TRUSTED_ORIGINS,而无法提前预知所有用户的主机/IP,常规添加具体地址的方案不可行,尝试添加泛域名格式也无效。
可行解决方案
方案1:使用通配符配置(Django 4.2+适用)
Django 4.2及以上版本支持在CSRF_TRUSTED_ORIGINS中使用通配符匹配所有HTTP/HTTPS来源,直接在settings.py中配置:
CSRF_TRUSTED_ORIGINS = ['http://*', 'https://*']
注意:此配置会信任所有HTTP和HTTPS来源,仅适合应用部署在可控的内部环境或信任网络中,避免暴露在公网环境下。
方案2:通过中间件动态添加可信来源
如果使用的是Django 4.0或4.1版本(不支持通配符),可以自定义中间件,在每次请求时将当前请求的Origin添加到CSRF_TRUSTED_ORIGINS中:
- 在项目中创建中间件文件(比如
middleware.py):
from django.conf import settings class DynamicCsrfTrustedOriginsMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): origin = request.META.get('HTTP_ORIGIN') if origin and origin not in settings.CSRF_TRUSTED_ORIGINS: settings.CSRF_TRUSTED_ORIGINS.append(origin) response = self.get_response(request) return response
- 在settings.py的
MIDDLEWARE列表中添加这个中间件(需放在CSRF中间件之前):
MIDDLEWARE = [ # 其他中间件... 'your_project_name.middleware.DynamicCsrfTrustedOriginsMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 其他中间件... ]
注意:这种方式会动态积累所有访问过的来源,若应用长时间运行,列表会逐渐增大,可根据需求添加去重或定期清理逻辑。
方案3:自定义CSRF验证逻辑(不推荐,仅极端场景使用)
如果上述方案都不适用,可以自定义CSRF验证逻辑跳过Origin检查,但此操作会降低CSRF防护能力,仅建议在完全信任所有访问来源的场景下使用:
在settings.py中添加基础配置弱化CSRF限制:
CSRF_COOKIE_SECURE = False CSRF_COOKIE_HTTPONLY = False
也可以针对特定视图使用@csrf_exempt装饰器跳过验证,但需逐个视图添加。
补充说明
- 保留
ALLOWED_HOSTS = ['*']和CORS_ORIGIN_ALLOW_ALL = True的配置,这是允许任意主机访问的基础。 - 如果用户使用HTTPS访问,需确保
CSRF_TRUSTED_ORIGINS中包含https://*。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

