【问题标题】:Using sec-websocket-protocol for authentication使用 sec-websocket-protocol 进行身份验证
【发布时间】:2017-06-25 05:28:30
【问题描述】:

我有一个基于 php websocket 的应用程序,其中 websocket 是核心。使用 sec-websocket-protocol 进行 身份验证 是否是个好主意。

这是我的计划。

用户使用那里的凭据登录,我使用 php 会话来跟踪页面之间的用户。

现在,当用户启动应用程序时,会生成一个随机令牌并将其存储在数据库中,然后在启动 websocket 时将其传递到标头中。标题看起来有点

Cache-Control:no-cache
Connection:Upgrade 
Host:tonywilk.no-ip.org:12352    
Origin:http://********.com:port 
Pragma:no-cache    
Sec-WebSocket-Key:DMF3ByMTLq+cp7AyMN0qUA== 
Sec-WebSocket-Protocol:**Token**      **<-- browser sends token 
Sec-WebSocket-Version:13 
Upgrade:websocket

我使用 token 来验证用户并通过握手发送服务器响应

Connection:Upgrade
Sec-WebSocket-Accept:L6wqtsHk6dzD+kd9NCYT6Wt7OCU=
Sec-WebSocket-Protocol: **Token**               <-- server replies ok
Upgrade:WebSocket

这是个好主意还是有更好的方法来做到这一点

【问题讨论】:

    标签: php phpwebsocket


    【解决方案1】:

    您应该使用Authorization 标头进行身份验证。

    使用Sec-WebSocket-Protocol 标头进行身份验证是个坏主意,因为它改变了标头的含义:

    |Sec-WebSocket-协议| WebSocket 中使用了 header 字段
    打开握手。它从客户端发送到服务器并返回 从服务器到客户端确认子协议
    联系。这使脚本既可以选择子协议又可以 确保服务器同意为该子协议提供服务。 (c)RFC 6455 – The WebSocket Protocol

    【讨论】:

    • 浏览器无法在 WebSocket 握手中发送授权标头。
    【解决方案2】:

    我正在为我的 websocket 应用程序使用 RatchetPHP。

    打开 websocket 连接时我无法传递标头,因此我将 OAuth2 令牌传递给 websocket uri。它看起来像这样:

    new Websocket('ws://localhost:8482?access_token=XXX')
    

    如果您可以在 websocket 应用程序中轻松检索查询参数,那么您可以尝试一下。

    这是我在 Sandstone 中使用的技巧:https://eole-io.github.io/sandstone/authentication.html

    【讨论】:

    • 当 URL 记录在服务器访问日志中时,这可能是不安全的。任何获得服务器日志的攻击者都可以访问所有用户的帐户。
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2019-07-28
    • 2011-09-04
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多