使用 Django 和 websocket 进行跨站请求伪造保护

keb*_*bie 2 django csrf django-channels

我已使用 Django 通道(v. 2.1.5)在 Django(v. 2.0)驱动的网站上成功创建了一个 websocket。

一切都很好,但我想知道 CSRF 令牌怎么样。如果是 websocket 的话需要吗?文档说它足以用来OriginValidator防止此类线程,但我想确保这一点。我的意思是,CSRF 代币发生了什么?我是否只是通过安全通道发送数据而没有它,后端会自动检查所有内容?如果是这样那为什么呢?为什么简单的视图不能做到这一点?

我知道这是一个相当悬而未决的问题,但我无法找到任何具体的解释,如果有人有一个我会非常感激。

小智 5

使用 Websocket 连接时不需要 CSRF 令牌。

当您访问恶意网站时,它可能会通过 javascript 向您当前登录的另一个网站发送后请求。您的浏览器还会向您发送会话 cookie 到该其他网站,因此网络服务器认为您确实愿意发送此后请求并将执行该请求。CSRF-cookie 可以防止这种情况发生。认为恶意站点无法读取 CSRF-cookie 的值,也无法将该值添加到后请求中。

恶意网站也有可能打开与其他站点的 Websocket 连接。这就是为什么你必须使用 OriginValidator 的原因。如果您使用它,则服务器仅接受来自站点的 Websocket 连接。

当恶意站点尝试打开与您的服务器的连接时,它会立即被拒绝。

因此,post-request 和 websocket-connections 之间的区别在于,浏览器在 websocket 连接上发送原始标头,但并不总是在 post 请求上发送。

似乎现代浏览器总是发送原始标头: https: //developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

所以也许您根本不必使用 CSRF-cookie。另请参阅:使用 CORS Origin 标头进行 CSRF 保护与 CSRF 令牌