Origin 标头对于保护 WebSocket 真的有用吗?

信息安全 http 网络套接字 标题
2021-08-30 14:32:53

我一直在阅读一些关于 WebSockets 安全性的文章,其中一些提到使用 Origin 标头来帮助保护连接。例如这个https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html

但是,我真的很怀疑它将提供的好处。为什么我需要使用 Origin 标头?或者更好地说,我将如何将 Origin 标头用于有用的东西?

2个回答

检查 Origin 标头可防止 WebSocket 被用户正在访问的另一个网站使用(例如提取数据)。

根据链接

WebSocket 不受同源策略限制

这是因为协议升级请求将有权访问用户的 cookie,因此如果您不检查来源,则请求可能来自example.com而不是您的站点example.net

例如,如果您有一个返回一些私有数据的 WebSocket 服务,您不希望用户通过读取您的数据而打开的恶意站点,因为用户已登录。

这与阻止另一个网站从您的网站中窃取内容无关 - 如果他们想这样做,他们只需从他们的后端建立到您的套接字 Web 服务的连接,他们可以在其中设置他们想要的任何 Origin 标头。检查 Origin 标头将停止对经过身份验证的内容进行此操作,因为他们无法让后端将用户的身份验证 cookie 提供给您的 Web 服务。

他们当然可以注册一个用户,然后使用他们的后端 HTTP 客户端发送身份验证 cookie。但是,他们将访问的唯一数据是他们自己的,而不是最终用户的。您可能希望检测某些用户名或远程 IP 是否正在拉取您的大量公共内容,以防止在您的服务中使用可能不是特定于用户的功能。

Origin 标头允许您防止其他网站将您的 websocket 服务暴露给他们的用户。

假设您构建了一个 Web 应用程序,该应用程序由一个相对无趣的 HTML+Javascript 客户端组成,该客户端www.example.net通过ws.example.net.

现在其他人创建了一个自己的网站www.example.com,它克隆了您的 html+javascript 端,但仍然连接到ws.example.net. 因此,他们可以让他们的用户在未经您许可的情况下窃取您的服务器容量和数据,从而从您的服务器后端中受益。你不喜欢那样。

你能做什么?

来自其他网站的用户的所有 websocket 连接都将拥有Origin:example.com,而来自您自己网站的用户则拥有Origin:example.net. 这允许您只接受来自您自己的访问者的连接。

但请记住,origin-header 是由 Web 浏览器设置的。当不浏览您的网站时,用户可能会操纵它以仍然连接到您的服务。此外,有人可能会构建和分发一个非浏览器应用程序,该应用程序使用伪造的原始标头连接到您的 websocket 服务器。检查原始标头只能防止通过不幸的互联网用户进行大规模滥用,这些用户不知道他们正在使用他们不应该使用的后端。