hyccn 2024-05-02 18:09 采纳率: 60%
浏览 12

django使用CSRF验证,但是网页没有获得名为csrf_token的cookie

本地运行时一切正常,名为csrf_token的cookie存在。
放在服务器上通过nginx反向代理,使用https域名访问时,发现浏览器不存在名为csrf_token的cookie,导致我的post失效,报错Forbidden(CSRF cookie not set)。
(还有一个神奇的现象,当我把csrf中间件关闭时,显然可以成功访问了,因为不必验证了。但是当我把csrf中间件再次打开后,原来没有的csrf的Cookie存在了,我从此可以成功通过csrf验证了。)
如图是post方法

img

如图是getCookie函数

img

如图是网页部分内容,可以看到表单存在隐藏csrf输入,但cookie中不存在csrf_token,导致getCookie不起作用

img

img

  • 写回答

5条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-05-02 18:42
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:在通过nginx反向代理使用https域名访问时,发现浏览器不存在名为csrf_token的cookie,导致post方法失效,报错Forbidden(CSRF cookie not set)。 分析:可能是nginx的反向代理处理导致了cookie的丢失。在关闭csrf中间件时,之后再次打开后,csrf的Cookie存在了,说明可能是在csrf中间件中对cookie进行了处理。 解决方案:
    1. 在nginx反向代理中,设置proxy_cookie_path和proxy_cookie_domain,使它们与服务器上的cookie的path和domain匹配。这可以通过以下方式实现:
    location / {
        proxy_pass http://backend;
        proxy_cookie_path / "/; HTTPOnly; Secure";
        proxy_cookie_domain backend.example.com example.com;
    }
    
    1. 在csrf中间件中,检查cookie的domain和path是否正确,并做出相应的处理。可以通过以下代码实现:
    def process_request(request):
        if not request.COOKIES.get('csrf_token'):
            csrf_token = get_new_csrf_token()
            request.COOKIES['csrf_token'] = csrf_token
        return None
    

    参考链接: - NGINX Docs | HttpProxyModule - Django Docs | CSRF Protection

    评论

报告相同问题?

问题事件

  • 创建了问题 5月2日