Django Rest Framework和OAuth2 Toolkit的额外保护层

时间:2016-06-07 08:10:15

标签: python django oauth-2.0 django-rest-framework django-oauth

这是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的人都可以代表此客户进行虚假请求。

我研究了这个问题,但我找不到任何一个解决这个问题的人。也许我在验证客户端时做错了什么?我会喜欢一些见解。也许它是一个简单的配置,我错过了开箱即用的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

这种攻击方法称为重放攻击。 This video by Professor Messer解释了重播攻击。

由于Web浏览器的透明性,您无法真正实现任何客户端(浏览器)来克服这一点。

您可以做的是使用随机数实现摘要式身份验证。

  

在密码学中,随机数是一个只能使用一次的任意数。

基本实现如下所示。

enter image description here

  1. 用户请求API服务器。
  2. API服务器以{401}和WWW-Authenticate标题中的随机数进行响应[你必须跟踪随机数](一个带有随机数的JWT设置为在一个小窗口中到期,可能是2秒或者少就会更好,无国籍。)
  3. 客户端使用收到的nonce,客户端nonce和密码对请求进行签名,然后再次调用该资源。
  4. API服务器验证签名,如果签名有效,则接受请求。
  5. 攻击者捕获请求并伪造用户。
  6. 由于nonce已过期/'仅使用一次',攻击者的请求将被拒绝。
相关问题