在Django Rest框架中测试CSRF保护视图
在测试需要身份验证的ApiView时,我遇到了麻烦。我想测试CSRF和authentications+权限是否按预期执行 有关我的设置的一些信息:在Django Rest框架中测试CSRF保护视图,django,django-rest-framework,Django,Django Rest Framework,在测试需要身份验证的ApiView时,我遇到了麻烦。我想测试CSRF和authentications+权限是否按预期执行 有关我的设置的一些信息: 我的视图是一个Django Rest框架Rest\u Framework.views.APIView,它实现了post功能 默认身份验证类是SessionAuthentication 默认权限类是IsAuthenticated 测试用例使用APIClient发出请求 当使用enforce\u csrf\u checks=True初始化APICli
- 我的视图是一个Django Rest框架
,它实现了Rest\u Framework.views.APIView
功能post
- 默认身份验证类是
SessionAuthentication
- 默认权限类是
IsAuthenticated
- 测试用例使用
发出请求APIClient
enforce\u csrf\u checks=True初始化APIClient
时,对于需要身份验证的视图(使用IsAuthenticated
权限类),我似乎仍然无法得到预期的响应
对于未经验证的视图,我可以测试CSRF保护,没有问题
有关意见:
@method_decorator(csrf_protect)
def post(self, request, format=None):
"""
Create a new user.
"""
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
测试代码:
client = APIClient()
response = client.post(url, data)
# Success!
client = APIClient(enforce_csrf_checks=True)
response = client.post(url, data)
# 403 FORBIDDEN
self.client = APIClient(enforce_csrf_checks=True)
self.client.login(email='t@t.se', password='pw')
self.client.get(url)
# Succeeds, even though it should not. No CSRF HTTP header is set.
对于经过身份验证的视图,情况会变得奇怪(此视图使用IsAuthenticated
权限:
def get(self, request, format=None):
"""
Get request user.
"""
user = User.objects.get(pk=request.user.id)
serializer = UserSerializer(user)
return Response(serializer.data, status=status.HTTP_200_OK)
测试代码:
client = APIClient()
response = client.post(url, data)
# Success!
client = APIClient(enforce_csrf_checks=True)
response = client.post(url, data)
# 403 FORBIDDEN
self.client = APIClient(enforce_csrf_checks=True)
self.client.login(email='t@t.se', password='pw')
self.client.get(url)
# Succeeds, even though it should not. No CSRF HTTP header is set.
客户端初始化参数enforce\u csrf\u checks
似乎没有任何作用,或者我不知道应该如何使用它。正如Clepsyd在中指出的那样,csrf并不是为了保护GET方法视图不受来自被劫持会话的请求的影响。事实证明,我只是真正有“问题”CSRF保护GET视图,其他什么都没有。因为它不打算在GET视图上使用CSRF保护,所以我的问题与此无关,我需要找到另一种保护GET视图的方法来防止数据泄漏。我对CSRF令牌的工作方式不是100%满意,但它们不应该保护POST、PUT和DELETE请求吗?我没有HinkGet请求曾经需要CSRF验证(django的文档似乎至少没有提到这一点):。此测试对POST请求的行为如何?很好的一点,这很可能是问题所在。我之所以要特别保护此视图,是为了尝试确保会话劫持者无法访问敏感的用户数据和个人信息。但是,我对CSRF了解不够,无法理解GET请求为什么不被视为CSRF保护“有价值”。我做了一些测试来证明你的评论,我对CSRF保护POST视图没有任何问题,只有GET。看来CSRF保护注定会阻止修改服务器上的数据,而GET请求不会这样做(至少不应该这样做).Wild猜测,但也许可以通过request.META info()来检查请求的来源(您的站点或恶意站点…?).不确定你会得到任何HTTP_REFERER数据,但值得一试吗?是的,你是对的。我正试图用螺丝刀敲入一颗钉子。我必须找到其他方法来保护get视图免受恶意攻击。非常感谢你的评论,我会将你的输入作为接受的答案。