Django请求中缺少自定义标头

owe*_*ncm 5 django wsgi http-headers amazon-elastic-beanstalk

上下文:我编写了一个Django应用程序,我现在已将其部署到Elastic Beanstalk(AWS).

在本地开发中,我一直在使用自定义请求标头SESSION_TOKEN,然后我可以使用它request.META.get('HTTP_SESSION_TOKEN').在生产中我看到错误,因为该标题是不可访问的(在我的Django服务器看到的所有请求中,它只是丢失了).

另外我的其他标准标题工作正常,它只缺少自定义标题.注意我没有设置HTTP_AUTHORIZATION,这与django rest_framework中缺少的Authorization标头不一样,是否需要apache?.

出了什么问题?如何在生产中访问后端的自定义标头?

mik*_*725 14

最有可能的SESSION_TOKEN标题被某些东西剥离了.来自Django安全咨询:

当HTTP标头放入WSGI环境中时,它们通过转换为大写,将所有短划线转换为下划线并预先加载HTTP_来规范化.例如,标头X-Auth-User将成为WSGI环境中的HTTP_X_AUTH_USER(因此也是Django的request.META字典).

不幸的是,这意味着WSGI环境无法区分包含短划线的标头和包含下划线的标头:X-Auth-User和X-Auth_User都变为HTTP_X_AUTH_USER.这意味着如果以安全敏感的方式使用标头(例如,从前端代理传递身份验证信息),即使代理小心地剥离X-Auth-User的任何传入值,攻击者也可能是能够提供X-Auth_User标头(带下划线)并绕过此保护.

以及最重要的信息:

为了防止此类攻击,Nginx和Apache 2.4+默认情况下会从传入请求中删除包含下划线的所有标头.Django的内置开发服务器现在也是如此.建议不要将Django的开发服务器用于生产用途,但匹配常见生产服务器的行为会减少部署期间行为更改的表面区域.

如果您有任何自定义标题,则应使用连字符.

  • 我把头发拉出来,因为标题不会出现在 django 中,第二部分解决了我的问题,我的名称中有下划线 (2认同)