我正在尝试对向匿名用户开放的 Django Rest API 强制执行 CSRF。为此,我尝试了两种不同的方法:
CSRFAPIView从一个基本视图扩展选定的 API 视图,该视图@ensure_csrf_cookie在调度方法上有一个注释。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)