为何Django会响应未在ALLOWED_HOSTS中配置的访问请求?
Django ALLOWED_HOSTS 配置项实际作用解答
ALLOWED_HOSTS并不限制发起请求的源IP地址,它的核心作用是校验HTTP请求头中Host字段的取值是否属于服务端允许的范围,和问题场景中提到的源IP为3.3.3.3没有任何关联。
问题场景中配置为
ALLOWED_HOSTS = ["1.1.1.1", "2.2.2.2"]时,3.3.3.3的请求仍能正常通过,是因为该请求的Host请求头填写的值为1.1.1.1或2.2.2.2,符合配置的允许规则,完全不受源IP的影响。
ALLOWED_HOSTS 是Django为了防范HTTP Host头攻击设计的安全配置:
- 攻击者可以构造携带恶意
Host头的请求,诱导站点生成指向恶意域名的链接、泄露跨站点的缓存内容,甚至触发CSRF校验绕过等问题 - 只有当请求的
Host头落在ALLOWED_HOSTS配置的列表中时,Django才会处理该请求,相当于明确了当前Django服务对外提供服务的合法域名/IP范围
如果需要限制请求的源IP地址,需要通过其他方式实现:
- 可以在Nginx、Apache等前置Web代理层配置IP访问控制规则
- 也可以自定义Django中间件,校验请求的
REMOTE_ADDR字段来拦截不符合要求的源IP
内容的提问来源于stack exchange,提问作者David Louda
相关产品推荐
相关产品推荐

