Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django Rest框架中测试CSRF保护视图_Django_Django Rest Framework - Fatal编程技术网

在Django Rest框架中测试CSRF保护视图

在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

在测试需要身份验证的ApiView时,我遇到了麻烦。我想测试CSRF和authentications+权限是否按预期执行

有关我的设置的一些信息:

  • 我的视图是一个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视图免受恶意攻击。非常感谢你的评论,我会将你的输入作为接受的答案。