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

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条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 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日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?