使用WebSocket连接时,有哪些可能的用户验证方式?
举个例子:我在做一个基于网页的多人聊天应用,使用的是websocket连接。我想确保每个连接都属于某个经过认证的用户,避免被假用户冒充或者在连接过程中被干扰。
顺便说一下,我在服务器端使用tornado websocket来实现基本的聊天室,并且已经为我应用的非websocket部分做了用户认证。
另外,假设一个经过认证的用户发布了他想要的信息,当其他用户打开这个信息的列表页面时,系统会自动把他们加入到websocket的监听列表中。我希望每个用户能够单独与商品的买家聊天,而不是在聊天室里,而是进行一对一的聊天。
3 个回答
这就是websocket连接的全部目的。你通过一种叫做握手协议的方式来验证它们。想了解更多信息,可以查看这里: https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-08
我很确定,websocket连接会把在非websocket连接中建立的所有cookies发送到你的应用程序。你应该可以查询Django的会话存储,找到这个连接的cookie,从而确定这个socket属于哪个用户。
可以查看这个链接了解更多信息: https://docs.djangoproject.com/en/1.3/topics/http/sessions/#configuring-the-session-engine
首先,你要记住关于WebSockets的两件事:(a)它是一个不断发展的标准,(b)它是为了能够与不可信的客户端进行工作而设计的。
使用WebSockets时,最重要的一点就是要检查它们的来源。如果来源不匹配,显然你不想和这个客户端打交道,所以就忽略他们的请求。此外,确保你使用的是“wss”这种安全的WebSocket协议,而不是“ws”这种不安全的协议。这样可以确保你的消息是加密的。
不过,仅仅这样做是不够的,因为这些信息可能会被伪造。你可以查看这篇博客,里面有一个简单的演示。
额外的安全措施:
- 尝试发送一个加盐的令牌,让它经过加盐/哈希处理后再返回并在握手阶段进行验证。
- 限制请求的频率(就像IRC协议那样)。如果用户在一秒钟内提交了10行或更多内容,就忽略这个用户。
- 进行快速的垃圾信息检查(有很多算法可以做到这一点)——保持轻量级的启发式方法,否则会给你的服务器带来负担。比如检查是否包含“免费”或“伟哥”等词汇。给用户一个分数,表示他们是垃圾信息发送者或机器人的可能性。当这个分数超过某个阈值时,就把他们踢出服务器。
希望这些对你有帮助!如果没有,那我很抱歉。这是我在StackOverflow上的第一次回答。:P