对Django的请求中缺少自定义标头

欧文

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

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

另外,我的其他标准标头工作正常,只是缺少自定义标头。注意我没有设置HTTP_AUTHORIZATION,这与django rest_framework中缺少Authorization标头的问题不同,这是Apache的责任吗?

怎么了?如何在生产环境的后端访问自定义标头?

miki725

SESSION_TOKEN标题很可能被某些东​​西剥离。来自Django安全公告

将HTTP标头放入WSGI环境后,它们将通过转换为大写字母,将所有破折号转换为下划线并在HTTP_之前进行标准化。例如,标头X-Auth-User在WSGI环境中(因此在Django的request.META词典中)将变为HTTP_X_AUTH_USER。

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

以及最重要的信息:

为了防止此类攻击,默认情况下,Nginx和Apache 2.4+都会剥离传入请求中包含下划线的所有标头。Django的内置开发服务器现在执行相同的操作。不建议将Django的开发服务器用于生产环境,但是与常见生产服务器的行为相匹配会减少用于部署期间行为变化的表面积。

如果您有任何自定义标头,则应改用连字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章