这是this的后续问题。
我使用最新的Django OAuth2 Toolkit (0.10.0)与Python 2.7,Django 1.8和Django REST框架3.3
一些背景:
在进行身份验证时,客户端会收到每次向服务器发出新请求时使用的新AccessToken
。此AccessToken
由客户拥有,并根据请求使用Authorization
标头进行传输。
我做的一个简单测试是从经过身份验证的客户端抓取此访问令牌,并使用来自其他计算机的简单HTTP请求在Authorization header
中发送它。
结果是这个新的"客户端"现在就像原始客户一样进行身份验证,他可以随心所欲地提出请求。
所以问题是:
访问令牌不绑定到任何形式的客户端验证(如会话ID或客户端IP地址)。任何可以获取/查找/窃取/查找客户端AccessToken
的人都可以代表此客户进行虚假请求。
我研究了这个问题,但我找不到任何一个解决这个问题的人。也许我在验证客户端时做错了什么?我会喜欢一些见解。也许它是一个简单的配置,我错过了开箱即用的解决方案。
谢谢!
答案 0 :(得分:1)
这种攻击方法称为重放攻击。 This video by Professor Messer解释了重播攻击。
由于Web浏览器的透明性,您无法真正实现任何客户端(浏览器)来克服这一点。
您可以做的是使用随机数实现摘要式身份验证。
在密码学中,随机数是一个只能使用一次的任意数。
基本实现如下所示。
WWW-Authenticate
标题中的随机数进行响应[你必须跟踪随机数](一个带有随机数的JWT设置为在一个小窗口中到期,可能是2秒或者少就会更好,无国籍。)