示例场景:通过websocket连接的基于Web的多用户聊天应用程序。我如何确保(或保证)此应用程序中的每个连接都属于某个经过身份验证的用户,并且"不能"被虚假用户冒充利用或在连接期间进行干预。
顺便说一下,我在服务器端使用龙卷风websocket来实现基本的聊天室,并且已经为我的应用程序的非websocket部分做了身份验证。
ps:假设认证用户发布了他想要的东西,当其他用户打开项目的列表页面时,自动将其他用户添加到websocket侦听器列表中,我希望每个用户能够单独与项目的买家聊天,而不是以聊天室的方式,而是一对一的聊天
首先,关于WebSockets有两件事你应该记住:(a)它是一个不断发展的标准;(b)它的设计意图是与不受信任的客户端一起工作。
对于WebSockets,你应该做的最重要的事情就是检查它们的来源。如果源不匹配,显然您不想处理该客户端,因此忽略它们的请求。此外,请确保您使用的是"wss"安全的WebSocket协议,而不是"ws"不安全的协议。这将确保您的消息是加密的。这样做的问题是,这些信息可能被欺骗。查看这篇博客文章来快速演示。
额外的安全:
- 尝试发送一个盐化令牌,将其盐化/散列,然后在握手阶段发送并验证。
- 限制频繁发生的请求(就像IRC协议一样)。如果用户在一秒钟内提交了10行或更多,忽略该用户。
- 做一个快速的垃圾邮件检查(有很多算法)——坚持轻启发式,否则它会给你的服务器带来负担。比如"免费"或"伟哥"的出现。给用户一个分数,代表他们是垃圾邮件或机器人的可能性。当它被破坏时,从服务器上引导它们。
希望有帮助!如果没有,很抱歉。这是我在StackOverflow上的第一个答案。: P
我很确定websocket连接会发送任何在非websocket连接中建立的cookie到你的应用程序。你应该能够查询Django的会话存储连接的cookie,并确定套接字属于哪个用户。
查看:https://docs.djangoproject.com/en/1.3/topics/http/sessions/#configuring-the-session-engine
这就是websocket连接的全部目的。您通过握手协议对它们进行身份验证。欲了解更多信息,请参阅此处:https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-08