【问题标题】:Extra protection layer for Django Rest Framework and OAuth2 ToolkitDjango Rest Framework 和 OAuth2 Toolkit 的额外保护层
【发布时间】:2016-10-07 00:46:46
【问题描述】:

这是this 的后续问题。

我在 Python 2.7、Django 1.8 和 Django REST framework 3.3 中使用最新的 Django OAuth2 Toolkit (0.10.0)

一些背景:
在进行身份验证时,客户端会收到一个新的AccessToken,每次 a 向服务器发出新请求时他都会使用该AccessToken。此AccessToken 归客户端所有,并根据请求使用Authorization 标头进行传输。

我进行的一个简单测试是从经过身份验证的客户端获取此访问令牌,并使用来自另一台机器的简单 HTTP 请求将其发送到 Authorization header
结果是这个新的“客户”现在就像原来的客户一样经过身份验证,他可以随心所欲地提出请求。

所以问题是:
访问令牌未绑定到任何形式的客户端验证(如会话 ID 或客户端 IP 地址)。任何可以获取/找到/窃取/查找客户端的AccessToken 的人都可以代表此客户端的虚假请求。

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    由于网络浏览器的透明性,您无法真正实现任何客户端(浏览器)来克服这个问题。

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

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

    基本实现如下所示。

    1. 用户请求 API 服务器。
    2. API 服务器响应 HTTP 401 和 WWW-Authenticate 标头中的 nonce [您必须跟踪 nonce](带有 nonce 的 JWT 设置为在一个小窗口中过期,可能是 2 秒或更短变得更好和无国籍)。
    3. 客户端使用收到的 nonce、客户端 nonce 和密码对请求进行签名,然后再次调用资源。
    4. API 服务器验证签名,如果签名有效则接受请求。
    5. 攻击者捕获请求并伪造用户。
    6. 由于 nonce 已过期/“仅使用一次”,因此攻击者的请求被拒绝。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2014-09-08
      • 2015-10-01
      • 2019-11-29
      • 2017-02-02
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多