【问题标题】:Dajngo sets CSRF cookie when I turn the CsrfViewMiddleware off. And does not set CSRF cookie when expected当我关闭 CsrfViewMiddleware 时,Django 设置了 CSRF cookie。并且不按预期设置 CSRF cookie
【发布时间】:2021-02-08 15:13:17
【问题描述】:

关于 Django 在 Postman 和 Chrome 中的 CSRF cookie 设置以及不同的设置,我有奇怪的行为:

情况1:

我在MIDDLEWARE 设置中设置了'django.middleware.csrf.CsrfViewMiddleware'

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

我使用 Postman 对 REST 端点进行 POST 调用:

class BlogCreateView(APIView):
    
    http_method_names = ['post']
    
    def get_context_data(self, **kwargs):
        return {
            'request': self.request,
            'kwargs': kwargs,
        }

    def post(self, request, **kwargs):
        """
        POST a new object
        """
        context = self.get_context_data(**kwargs)
        serializer = self.serializer(data=request.data, context=context)
        serializer.is_valid(raise_exception=True)
        new_instance = serializer.save()
        return Response(serializer.data, status=HTTP_201_CREATED)

CSRF cookie 未设置。我也没有在请求的标头中设置 csrf 值。但服务器接受它。这不应该发生吧?

情况2:

当我在 Chrome 浏览器中直接转到 http://localhost:8000/blogs/create 时。这会向同一端点发出 GET 请求。响应是"detail": "Method \"GET\" not allowed.",这是预期的。但是cookie是在浏览器中设置的。

情况3: 我关掉CsrfViewMiddleware

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

我使用 Postman 对我的 Graphene 端点进行 POST 调用:

from graphene_django.views import GraphQLView
urlpatterns = [
    path('graphql', GraphQLView.as_view(graphiql=True)),
]

现在 cookie 已在 Postman 中设置!这种情况的组合对我来说毫无意义。非常感谢您的帮助。

我的目标是最终让 csrf 保护在生产环境中发挥作用。但我想在本地测试一下。

【问题讨论】:

    标签: django django-rest-framework postman csrf


    【解决方案1】:

    尝试插入django.middleware.csrf.CsrfViewMiddleware之后 django.contrib.sessions.middleware.SessionMiddleware

    像这样:

    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    

    【讨论】:

    • 我试过了。同样的事情仍然发生。谢谢你的建议。我在问题的代码中更新了它。
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2017-05-05
    • 2020-12-05
    • 2013-05-12
    • 2013-03-28
    • 2012-05-03
    相关资源
    最近更新 更多