代码之家  ›  专栏  ›  技术社区  ›  yojimbo87 jesuisbonbon

WebSockets身份验证

  •  29
  • yojimbo87 jesuisbonbon  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   rook    14 年前

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

        2
  •  44
  •   Derek Dahmer    12 年前

    警告:有人指出,当使用flashsockets时,以下情况不起作用:
    如果你用的是 socket.io ,甚至更容易连接时自动传递Cookie,并且可以按如下方式进行访问:

    var io = require('socket.io');
    var socket = io.listen(app); 
    socket.on('connection', function(client){ 
        cookies = client.headers['cookie'];
    });
    
        3
  •  1
  •   kag0    4 年前

    有两种方法。

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

    另一种方法是使用cookies(浏览器会在每次请求时自动发送cookies)。这要求您实现CSRF保护(甚至比正常情况下更多,因为websockets没有同源策略(SOP))。你可以找到细节 here . 大纲如下:

    1. 后端在响应主体中返回一个CSRF令牌,并使用 SameSite=Strict
    2. 通过在查询参数中添加CSRF令牌,尝试与后端建立websocket连接
    3. 后端检查
      • websocket auth cookie和CSRF令牌是否有效
      • Origin 标头与已批准的域匹配

    第一种方法比较简单,但缺点是它需要一些服务器端状态等待客户机进行身份验证。这使得攻击者能够通过使用所有可用的套接字来执行拒绝服务攻击。