【问题标题】:WebSockets authenticationWebSockets 身份验证
【发布时间】:2011-02-11 16:23:30
【问题描述】:

使用 websocket 连接时有哪些可能的用户身份验证方式?

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

【问题讨论】:

    标签: security websocket


    【解决方案1】:

    如果您已经在对应用程序的非 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'];
    });
    

    【讨论】:

    • 你确定这总是有效的吗?例如,如果 Socket.IO 退回到 Flash 套接字,则不会发送浏览器 cookie (AFAIK)。
    • @Thomas 你是对的,有一个issue filed 提到你应该通过第一条消息进行身份验证。
    • 这是一种实用的方法,但它要求进行登录(和 cookie 设置)的网页与 WebSocket 来自同一来源,否则 cookie(从登录页面设置)不会在 WebSocket 连接上发送。
    • 依赖 cookie 是个坏主意,因为允许跨域 WebSockets 并将传递与目标 url 关联的 cookie。除非您同时检查 Origin 标头,否则这会使您对 CORS 攻击敞开大门。
    • 如果您使用 CORS,Cookie 将不起作用。 SocketCluster 曾经使用 cookie 来存储 JWT 令牌,但后来​​不再使用它。见github.com/SocketCluster/socketcluster-client/issues/9
    【解决方案2】:

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

    【讨论】:

    • 你的意思是SSL证书将分别用于HTTP和WebSocket连接?
    • 我不同意 rook 所说的话。 SSL/TLS 可以确保数据在传输层不发生变化。但这里的问题是,我们如何知道 Web 套接字请求来自用户 A 而不是用户 B?图像用户 A 和 B 都已登录。因为 web-socket 在建立连接后不发送 cookie。那么在后面,这个 web-socked 是如何确保请求来自真实用户 A 而不是用户 B 的呢?
    【解决方案3】:

    有两种方法。

    一种方法是允许任何人打开 websocket 连接。让客户端在打开连接后发送一个授权令牌作为第一条消息。如果客户端在一段时间内没有发送有效的令牌,请关闭连接。

    另一种方法是使用 cookie(它们由浏览器在每次请求时自动发送)。这需要你实现 CSRF 保护(甚至更多,因为 websockets 没有同源策略(SOP)。你可以找到详细信息here。大纲如下:

    1. 使用站点的正常身份验证从 js 向后端发出“websocket preauth”请求
    2. 后端在响应正文中返回一个 CSRF 令牌,并在响应标头中设置一个带有 SameSite=Strict 的“websocket auth”cookie
    3. 尝试与后端建立 websocket 连接,并在查询参数中添加 CSRF 令牌
    4. 后端检查
      • websocket auth cookie 和 CSRF 令牌有效
      • Origin 标头的值与已批准的域匹配
    5. 后端发送响应并升级连接以使用 websockets

    第一种方法更简单,但缺点是它需要您有一些服务器端状态等待客户端进行身份验证。这可以让攻击者通过消耗所有可用的套接字来执行拒绝服务攻击。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 2017-08-25
      • 2021-10-11
      • 2013-06-26
      • 2016-08-15
      • 2018-11-07
      • 2015-02-02
      • 2018-02-24
      相关资源
      最近更新 更多