如何确保只允许在特定域列表上托管的脚本连接到我的WebSocket应用程序?
或者为了防止以观点为基础的近距离投票,是否有最先进或本土的方式?
我不打算实施用户身份验证。
答案 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套接字消息来检查连接的有效性。