【问题标题】:Preventing CSRF for websockets防止 websocket 的 CSRF
【发布时间】:2012-09-03 08:33:17
【问题描述】:

我目前正在考虑 websockets 中的 CSRF 漏洞。

我已经阻止了所有跨域 websocket 请求,但是有脚本(例如this python bad boy)可以绕过这些安全措施。

是否值得在用户的 index.html 中包含一个令牌,它必须作为查询字符串包含在 socket.io.connect() 调用中?这样在服务器上我们可以检查令牌是否符合我们的预期,否则阻止连接请求。

感谢所有建议!

【问题讨论】:

    标签: websocket socket.io csrf csrf-protection


    【解决方案1】:

    为什么不为你的 socket.io 连接设置一个授权处理程序?您可以根据握手期间收集的信息拒绝/接受那里的连接。

    有关更多详细信息,请参阅https://github.com/LearnBoost/socket.io/wiki/Authorizing

    【讨论】:

    • 但是在授权的时候,是不是应该包含一个csrf token呢?当使用调用socket.io.connect()时调用Authorize
    • 您可以为 io.connect 提供 url 参数并将令牌添加到那里.. io.connect('http://example.com?token=' + mytoken')
    • 嘿 3rdEden,你会做得更好吗? a) 将每条消息上的 _csrf 令牌发送到服务器?或 b) 仅在 socket.io.connect() 中发送 _csrf 令牌?只是出于好奇
    • url中出现csrf token有什么风险? “中间人”呢?仅在消息中而不在第一次连接中检查 csrf 会更好吗?
    • 在大多数情况下,连接期间的令牌就足够了。我看不出你有什么理由为每条消息都发送它,因为你已经授权了连接。
    【解决方案2】:

    我在 django 中使用 socket.io。我处理授权的方式是首先要求用户使用包含 CSRF 令牌的常规 HTTP 表单登录。成功登录后,会设置会话 cookie,并将用户重定向到 socket.io 应用程序。

    在我的连接授权代码中,我检查 cookie 并验证用户是否已登录,如果检查失败则返回“401 Not Authorized”。

    如果您不想要求用户先登录,也可以设置 CSRF cookie 并检查它,或者您可以在授权期间将 CSRF 令牌作为 URL 参数传递,正如@3rdEden 指出的那样。

    【讨论】:

    • 您可能希望在连接期间传递 CSRF 令牌,而不是简单地检查 auth cookie。 WebSockets 甚至跨域发送标头,这与 CORS 与 XHR 的工作方式不同。 christian-schneider.net/CrossSiteWebSocketHijacking.html
    • 投反对票!正如 filgovi 所指出的,从攻击者的站点创建到您的站点的 socket.io 连接仍会发送会话 cookie,因此攻击者的 Javascript 可以作为用户完全访问 socket.io 连接。
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2018-01-08
    • 2013-10-26
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多