我们有一个在第三方网站上运行的"小部件",即任何注册我们的服务并嵌入JavaScript的人。
目前,我们使用JSONP进行所有通信。我们可以通过使用iFrame和一些检测加载事件的魔术来安全地登录和创建帐户。(本质上,我们要等到iFrame源指向客户端域后,才能从标题中读取成功值)。
因为我们在JSONP上运行,所以我们可以使用浏览器HTTP cookie来检测用户是否登录
然而,我们正在将我们的系统转换为实时运行和通过web套接字运行。我们仍将使用相同的身份验证方法,但不一定要使用JSONP进行其他调用。相反,这些调用将通过websocket(使用库Faye)进行
如何确保安全?潜在的安全漏洞是,如果有人从现有网站上复制JavaScript,对其进行更改,然后让人们访问他们的网站。我认为这违背了我最初的想法,即在登录时发送回一个安全令牌,因为恶意JavaScript可以读取它,然后使用它执行经过身份验证的操作。
我最好让我的安全操作运行在常规的JSONP上,并通过WebSockets进行更新吗?
Websocket连接仅在开始握手时接收cookie。唯一可以访问您的websocket连接的站点是打开它的站点,所以如果您在身份验证后打开连接,那么我认为您的安全性将与您当前的JSONP实现相当。
这并不是说您的JSONP实现是安全的。我不知道不是,但你是否在检查你的JSONP请求的引用人,以确保它们真的来自登录的同一个第三方网站?如果没有,那么您已经存在来自嵌入javascript的其他站点的安全问题。
在任何情况下,第三方有XSS漏洞也会是一个很大的问题,但你可能已经知道了。
WS规范没有指定浏览器在打开WebSocket握手期间是否向您发送cookie(如果是,则发送哪些cookie)。这取决于浏览器供应商。
WS连接可以打开到任何站点,而不仅仅是最初为进行连接的JS服务的站点。但是,浏览器必须将WS打开握手中的"Origin"HTTP标头设置为最初为JS服务的标头。然后,服务器可以自由地接受或拒绝连接。
也就是说,您可以在JS中生成一个随机字符串,存储该客户端,并让它加上客户端IP参与计算WS的身份验证令牌。。