小编DJ *_*nes的帖子

为什么 Django/Django REST Framework 不深入验证 CSRF 令牌,即使使用强制 CSRF 也是如此?

我正在尝试对向匿名用户开放的 Django Rest API 强制执行 CSRF。为此,我尝试了两种不同的方法:

  1. CSRFAPIView从一个基本视图扩展选定的 API 视图,该视图@ensure_csrf_cookie在调度方法上有一个注释。
  2. 使用基于 SessionAuthentication 的自定义身份验证类,enforce_csrf()无论用户是否登录都适用。

在这两种方法中,CSRF 检查似乎都在表面上起作用。如果 cookie 中缺少 CSRF 令牌或令牌长度不正确,端点将返回403 - Forbidden. 但是,如果我编辑 cookie 中的 CSRF 令牌的值,则该请求将被毫无问题地接受。所以我可以使用 CSRF 的随机值,只要它的长度正确。

此行为似乎偏离了常规 Django 登录视图,其中 CSRF 的内容确实很重要。我正在本地设置中使用 debug/test_environment 标志进行测试。

我在 DRF 中进行的自定义 CSRF 检查未经过深入验证的原因可能是什么?

自定义身份验证的代码片段:

class RestCsrfAuthentication(SessionAuthentication):
    def authenticate(self, request):
        self.enforce_csrf(request)
        rotate_token(request)
        return None
Run Code Online (Sandbox Code Playgroud)

并在设置中:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'csrfexample.authentication.RestCsrfAuthentication',
    ]
}
Run Code Online (Sandbox Code Playgroud)

django csrf django-rest-framework

3
推荐指数
1
解决办法
2019
查看次数

标签 统计

csrf ×1

django ×1

django-rest-framework ×1