确保WebSockets仅从已知域连接

时间:2014-05-26 21:56:27

标签: validation authentication dns websocket

如何确保只允许在特定域列表上托管的脚本连接到我的WebSocket应用程序?

或者为了防止以观点为基础的近距离投票,是否有最先进或本土的方式?

我不打算实施用户身份验证。

2 个答案:

答案 0 :(得分:3)

使用WebSocket的机制是origin标题。

此HTTP标头由浏览器设置为服务于包含打开WebSocket连接的JavaScript的HTML的主机的域。

WebSocket服务器可以在WebSocket协议的初始打开握手期间检查origin标头。然后,如果origin与已知白名单匹配,则服务器只允许继续连接。

无法从JavaScript修改标头,并且RFC6455规范要求所有浏览器 以包含它。

警告:非浏览器 WebSocket客户端当然可以将origin标头伪造为其喜欢的任何值。

答案 1 :(得分:1)

@oberstet给了你正确的答案。

如果您担心机器人或程序化HTTP代理,那么您将度过一段美好时光。 HTTP请求中的所有内容都可能被欺骗。您唯一的选择是使用cookie附加时间有限的令牌,以证明用户通过允许的网站获取该脚本。在WebSocket握手中获取该cookie并决定是否允许它。

例如:当用户访问您的站点或您的某个站点时,根据用户IP地址,User-Agent标头和Origin标头返回带有对称加密令牌的cookie;当用户启动WebSocket连接时,如果它在同一个第二域中,它将发送cookie,然后如果数据加起来允许连接,否则拒绝它。如果WS位于另一个域中,那么在建立连接后,您将不得不忘记cookie并依赖Web套接字消息来检查连接的有效性。