2

我们有一个在第三方网站上运行的“小部件”,即任何注册我们的服务并嵌入 JavaScript 的人。

目前我们使用 JSONP 进行所有通信。我们可以通过使用 iFrame 和一些检测其上的加载事件的魔法来安全地登录并创建帐户。(本质上,我们等到 iFrames 源指向客户端域,然后再从它的标题中读取成功值)。

因为我们在 JSONP 上运行,所以我们可以使用浏览器的 HTTP cookie 来检测用户是否登录。

但是,我们正在将我们的系统转换为实时运行并通过 Web 套接字运行。我们仍将使用相同的身份验证方法,但我们不一定会使用 JSONP 进行其他调用。相反,这些调用将通过 websockets 发生(使用库 Faye)

我怎样才能确保这一点?潜在的安全漏洞是,如果有人从现有站点复制 JavaScript,对其进行更改,然后让人们访问他们的站点。我认为这违背了我最初在登录时发回安全令牌的想法,因为恶意 JavaScript 能够读取它然后使用它执行经过身份验证的操作。

我是否最好让我的安全操作通过常规 J​​SONP 运行并通过 WebSockets 进行更新?

4

2 回答 2

4

Websocket 连接仅在打开握手期间接收 cookie。唯一可以访问您的 websocket 连接的站点是打开它的站点,因此如果您在身份验证后打开连接,那么我认为您的安全性将与您当前的 JSONP 实现相当。

这并不是说您的 JSONP 实现是安全的。我不知道不是,但是您是否正在检查您的 JSONP 请求的引用者以确保它们确实来自登录的同一个第 3 方站点?如果没有,您已经遇到了来自嵌入您的 javascript 的其他网站的安全问题。

无论如何,第 3 方有 XSS 漏洞也是一个很大的问题,但想必你已经知道了。

于 2012-02-21T03:56:44.540 回答
0

WS 规范没有指定在浏览器打开 WebSocket 握手期间是否向您发送 cookie(如果是,是什么 cookie)。它由浏览器供应商决定。

WS 连接可以打开到任何站点,而不仅仅是最初为 JS 提供服务的站点进行连接。但是,浏览器必须将 WS 打开握手中的“Origin”HTTP 标头设置为最初为 JS 服务的标头。然后服务器可以自由地接受或拒绝连接。

您可以即在 JS 中生成一个随机字符串,存储该客户端,然后让它加上客户端 IP 参与计算 WS 的身份验证令牌。

于 2012-02-21T11:37:47.807 回答