当前位置: 首页 > 知识库问答 >
问题:

多个csrftoken cookies,RFC是否要求只有1个csrftoken?

濮阳国兴
2023-03-14

我试图找到以下问题的答案。

  • 在什么情况下浏览器会存储多个csrfTokencookie?
  • 它是正确的,还是技术上有效的功能?
  • 在RFC/安全留档中,通过数组,或尝试csrfToken的数组存在,或者在技术上有效?

我附上了一个示例屏幕截图,展示了我看到的多个csrftoken,以及各种cookie路径和到期时间(多租户和各种表单路径)。

相关的:

  • https://github.com/django/django/blob/5a68f024987e6d16c2626a31bf653a2edddea579/django/middleware/csrf.py#L324

共有2个答案

东方栋
2023-03-14

这里代币存储在cookie中。Cookies根据其范围(域和路径)和cookie名称是唯一的。

在这种情况下,所有cookie都具有相同的名称-csrfToken,它们也具有相同的域-127.0.0.1,但是每个cookie的路径是唯一的。因此,不同的范围(更具体地说,路径)允许具有多个cookie。

描述防止CSRF攻击的保护措施的最受引用和尊重的文档是OWASP跨站点请求防伪备忘单(GitHub Markdown变体)。

每个html" target="_blank">用户会话生成一个csrf令牌并将其存储在cookie中是最流行的方法。与会话关联使其在某种程度上不受cookie更改的影响。请注意,您应该使用其他方法(即双重提交cookie,并在请求正文中包含令牌)进行保护,因为cookie是根据请求自动发送的。

会话更改视图(登录/注销/密码更改)和其他重要且高安全性的视图(即转账)可以并且应该使用高级和/或附加技术(即用户交互)进行保护。

为什么返回多个csrf令牌?

后端行为的可能解释:这可能是试图向应用程序添加图形ql支持。它看起来也像是Graphql和rest的结合。

/graphqlendpoint发出请求,该endpoint依次遍历所有其他rest apiendpoint,就好像将来可能向它们发出POST/PUT/PATCH请求一样,每个endpoint/视图向响应添加自己的每个路径/每个表单(甚至每个请求)csrftoken cookie。此外,使用这种方法,下一个请求可能不会发送到/graphqlendpoint,而是直接发送到RESTAPIendpoint/视图url之一。

使用Graphql,您将只有一个/Graphqlendpoint,所有请求都将向它发出。

此外,拥有多个csrf令牌(每个endpoint)也不会带来任何好处。

有关向django添加GraphQLAPI的方法,请查看Graphene

如果您正在考虑将单独的前端应用程序与Django后端一起使用,那么您肯定应该查看Django cors头文件(并使用它)。

邴烨
2023-03-14

不要求只有一个令牌,但更常见的方法是在单个根路径上更新/刷新CSRF令牌cookie:/

这实际上取决于服务器如何解释每个令牌请求之后的潜在表单帖子。一种简单的方法是在设置cookie之前将新生成的令牌存储在用户的会话存储(内存或数据库中)。然后,当用户的表单帖子到达时,在服务器上再次比较这两者。

>

  • 当每个HTTP GET请求(用令牌响应)指定自定义cookie路径时,浏览器会存储多个令牌cookie。更常见的方法是使用一个cookie来防止CSRF。

    您可以使您的令牌路径特定,但这不会使您的令牌更安全。

    测试令牌有效性完全取决于您。

    希望这有帮助。

  •  类似资料:
    • 我尝试了上述命令的各种组合,但结果总是上面给出的错误消息。为什么会发生这样的事情--因为我是按照文档所说的去做的?

    • 我试图从特定的Dockerfile构建镜像,并同时标记它;我遵循的在线说明,但我得到以下错误: “docker build”只需要1个参数 这是我运行的命令: 我尝试了上述命令的各种组合,但结果总是上面给出的错误消息。为什么会发生这种情况——因为我在遵循留档所说的?

    • 原始关闭原因未解决 我只是想从另一个目录构建dockerfile,我尝试了以下命令 和 它们都产生相同的错误

    • 我正在用JavaFX开发一个音乐库应用程序,我在如何正确使用MediaPlayer类方面遇到了一些问题。 这是我目前设置和播放音频文件的方法: 比如说,我有两个音频文件。。。 ...以及将这两个文件中的一个发送到上述方法的两个按钮: 通常,两个音频文件都会相互播放是有意义的,因为每次调用该方法时我都会创建一个新的MediaPlayer对象,但是,该对象是静态的。也许我误解了静态对象的工作原理,但这

    • 现在有个需求要求我用nestjs写一个接口,处理本地一个json文件处理成一个html页面返回给前端 ,我想问比如返回的格式是这样,"text":'<style>.helloword{width:100px;}</style> <div class="helloword" (click)="handleclick()">你好</div>' 这样返回去的样式和点击事件是否能生效。如果不行该如何做?大

    • 我想申请以下权限:。根据这个答案,我是这样申请权限的: 问题是我的应用程序只请求存储权限没有别的。 和是未请求或授予的权限。我如何按顺序询问所有权限? 以下是未授予和权限的证明: