WebSockets身份验证

yoj*_*o87 29 security websocket

使用websocket连接时,对用户进行身份验证的可能方法有哪些?

示例场景:通过加密websocket连接的基于Web的多用户聊天应用程序.如何确保(或保证)此应用程序中的每个连接都属于某个经过身份验证的用户,并且在连接期间由于虚假用户模拟而"无法"利用该连接.

Der*_*mer 42

如果您已经对应用程序的非websocket部分进行身份验证,则只需在连接后将会话cookie作为第一条消息传递,并像往常一样检查cookie.

警告:有人指出,当使用flashsocket时,以下内容不起作用:
如果您使用的是socket.io,则更容易 - Cookie会在连接时自动传递,并且可以像下面这样访问:

var io = require('socket.io');
var socket = io.listen(app); 
socket.on('connection', function(client){ 
    cookies = client.headers['cookie'];
});
Run Code Online (Sandbox Code Playgroud)

  • 你确定这总能奏效吗?例如,如果Socket.IO回退到Flash套接字,则不会发送浏览器cookie(AFAIK). (4认同)
  • 取决于cookie是一个坏主意,因为允许跨源WebSockets并将传递与目标URL关联的cookie.这使您对CORS攻击持开放态度,除非您也检查Origin标头. (2认同)

roo*_*ook 3

SSL/TLS 可用于使用 X.509 证书对客户端和服务器进行身份验证。这取决于您使用的网络应用程序平台。在 apache 中,可以根据已知有效证书列表检查SSL_CLIENT_CERT环境变量的有效性。这不需要使用完整的 PKI,也不需要您为每个客户端购买证书。尽管我建议使用 CA 来支持服务器的 ssl 证书。

  • 我不同意鲁克所说的。SSL/TLS可以保证传输层数据不被改变。但这里的问题是,我们如何知道 Web 套接字请求是来自用户 A 而不是用户 B?图像用户 A 和 B 都已登录。由于 Web-socket 在建立连接后不会发送 cookie。那么后面这个web-socked如何保证请求是来自真实的用户A而不是用户B呢? (2认同)