我正在编写一个 SaaS Web 应用程序,其中数据通过 Websockets 提供给客户端。我已经通过连接上的用户访问令牌实现了身份验证。我需要防止来自不同站点以及卷曲请求的 Websocket 连接。
站点原始策略和跨源资源共享(CORS)对于 websocket 无效,因此当将 http 连接升级到 websocket 时,验证 origin 标头将阻止来自其他网站的访问,因为 Origin 标头是由浏览器验证的。
这里的问题是,只有浏览器发起的请求才需要真实的来源。可以通过浏览器外部的curl 请求来欺骗源。那么如何防止用户使用身份验证令牌连接到 websocket 并欺骗源呢?
验证原始标头将阻止从其他网站访问,因为原始标头是由浏览器验证的。
这就是标题中问题的答案——在服务器端验证 HTTP Origin 标头将防止劫持,因为浏览器将发送正确的源。
尚不清楚您为何担心用户在浏览器外部进行连接的能力。与 CSRF 一样,跨站点 Websocket 劫持实际上是针对用户浏览器及其信任的攻击,而不是针对服务器本身的攻击。因此,出于安全目的的 Origin 标头的概念在浏览器上下文之外并不真正相关。
通过网站,您无法真正控制有关客户的任何信息。即使用户确实在具有正确来源的浏览器中访问您的网站,他们也可以运行 JavaScript 来发送任意 WebSocket 消息(如果这是您关心的问题)。如果您仍然担心用户执行此操作的能力,那么花一些时间审核服务器端的逻辑和验证可能是明智的,以确保应用程序行为正确,无论用户向其抛出什么。