我有一个在nginx代理后面运行的Django服务器。我目前正在尝试通过阅读request.META['REMOTE_ADDR']
来确定远程地址。更确切地说:一个限制试图强行破坏我的用户密码(Django-brutebuster)的应用程序正在这样做。
由于Django落后于nginx,REMOTE_ADDR
是Nginx(127.0.0.1)的地址,所以这并不是真的有用。它还通过故意误解密码向DOS打开我的应用程序,因为从brutebuster的角度来看每个人都在同一个IP上。
我在这个论坛上发现了类似的问题:
我想可以在上面找到拼图的各个部分。但是,我也假设他们打开了新攻击向量的应用程序。具体来说,如果Django由于某种原因没有在nginx后面运行,那么自动检查X-something标头会打开来自客户端的欺骗。
令我感到有些惊讶的是,在上述任何一个问题中似乎都没有提到“正确且唯一的方法”(TM)。答案。 Django没有针对这个问题的规范解决方案吗?除此之外,我们能否提出一个至少不会产生安全问题的解决方案?
答案 0 :(得分:1)
“正确且唯一的方法”(TM)的问题在于它需要提供应用程序和部署配置的指令。
Django以前有一个SetRemoteAddrFromForwardedFor
中间件,但它被删除了,因为“这个机制不能足够通用”(你可以查看release notes of django 1.1)
您正确地描述了问题 - 您不能通常信任到Django应用程序收到的所有标头。具有此类标头的情况特定于部署太多,这就是为什么它缺乏通用解决方案。
要保护此类标头,您需要强制在nginx / haproxy /上设置此标头。