我在项目中使用Django remote user authentication。我实际使用的只是django.contrib.auth.RemoteUserBackend
没有中间件,并在用后端检查用户是否合法后手动调用authenticate
。
读取中间件的来源,似乎它只是从请求中的标头获取用户名,然后根据传递此用户名的后端对用户进行身份验证。反过来,远程用户后端只是使用任何传递的用户名快速登录用户。然后,用户可以访问需要有效登录的每个区域。
这不是一个巨大的安全漏洞吗?这意味着如何使用?
在我的情况下,我应该是安全的,因为authenticate
的唯一呼叫是在成功进行远程身份验证之后,但我想知道中间件被引入的原因。
答案 0 :(得分:8)
让我来谈谈你:如果你认为这是一个安全漏洞,那么尝试编写一个漏洞利用程序,在你的应用程序的请求中设置REMOTE_USER
标头,看看会发生什么。
REMOTE_USER
可以追溯到网络的早期阶段,当CGI页面作为您使用网页的用户在本地执行时。 REMOTE_USER
实际上是表示活动用户的unix环境变量的名称。随着Web服务器的安全模型发生变化,保留了此方案以实现兼容性。现在,即使IIS支持它透明地处理Active Directory登录。
所有用户传递的标头都以HTTP_
开头。否则,您无法信任任何标题信息,例如SERVER_NAME
,这将是一个巨大的混乱。
答案 1 :(得分:2)
Django'快乐地将用户登录',因为您的网络服务器已检查访问者是否拥有该用户名的有效凭据,并相应地设置了标题。
如果您信任您的网络服务器(例如Apache)正确设置REMOTE_USER
(或其他)标头,那么这不是安全漏洞。
答案 2 :(得分:1)
您可以查看文档here。用户无法发送带有客户标头的REMOTE_USER
的请求。
警告
如果使用带有自定义HTTP标头的RemoteUserMiddleware子类,请非常小心。您必须确保您的前端Web服务器始终根据适当的身份验证检查设置或剥离该标头,决不允许最终用户提交伪造(或“欺骗”)标头值。由于HTTP标头X-Auth-User和X-Auth_User(例如)都标准化为request.META中的HTTP_X_AUTH_USER键,因此,您还必须检查Web服务器不允许使用下划线代替破折号的欺骗标头。
此警告不适用于标头='REMOTE_USER'的默认配置下的RemoteUserMiddleware,因为请求中的密钥不是以HTTP_开头的.META只能由WSGI服务器设置,而不能直接从HTTP设置请求标头。