【问题标题】:How to prevent spam when using websocket-rails gem?使用 websocket-rails gem 时如何防止垃圾邮件?
【发布时间】:2013-03-07 08:35:52
【问题描述】:

考虑以下实现井字游戏:

一个玩家通过触发主调度器上的事件来发送移动。

var dispatcher = new WebSocketRails('localhost:3000/websocket');

var channel = dispatcher.subscribe_private('private_game');
channel.bind('new_move', function(move) {
  // received new move, process it
});

// later on when we want to send a move to the server we run the following code
var move = {
  square: ...;
}
dispatcher.trigger('move', move);

在服务器上,控制器可以验证用户是否已获得特定井字游戏的授权。然后它可以向双方玩家广播这一举动。

class TicTacToeController < WebsocketRails::BaseController
  def move
    # code to verify the move is valid and save to database
    ...

    # broadcast move to all players
    WebsocketRails[:private_game].trigger(:new_move, message)

  end
end

但是没有强制要求客户端仅使用主调度程序发送消息。假设“private_game”频道仅供服务器用于广播动作。但是一个敌对的客户端可以在其上发送随机数据

channel.trigger('new_move', randomdata);

由于通道事件不通过事件路由器,因此不通过控制器操作,因此服务器端没有任何东西可以过滤掉随机垃圾邮件。

有没有办法阻止服务器上的随机数据垃圾邮件?也许我误解了如何使用 websocket-rails?

【问题讨论】:

  • 我考虑的一个策略是对服务器发起的消息使用随机的每个客户端通道。因此,您拥有用于客户端 -> 服务器的主通道,然后对于服务器 -> 客户端,使用类似“game-#{game.id}-#{SecureRandom.hex(6)}”的通道。您需要在初始设置期间告诉客户端随机通道。如果这个建议很有趣,我可以扩展为正确的答案。
  • @DaveS。我有兴趣看一个例子。是否有必要执行所有这些操作表明 WebSocket-Rails gem 中缺少功能?
  • 在我的特殊情况下,我最终不需要它(因此没有现成的示例)。同样在我的情况下,我使用的是主宰,而不是 websocket-rails,所以它可能没有直接关系。只是把这个想法扔掉,以防它激发你找到一个间接的解决方案。
  • 这里是 WebsocketRails gem 的作者...这绝对是 gem 中缺少的功能。我从来没有亲自在这种情况下使用过通道,所以我没有考虑在通道系统中提供一个授权层来允许您屏蔽恶意消息。我想包含这个功能,因为它看起来非常有用。请在问题跟踪器上打开一个问题,以便我将其放入列表中。谢谢。

标签: ruby-on-rails ruby-on-rails-3 websocket


【解决方案1】:

在 Gem 更新以更好地支持此功能之前,您现在可以处理此问题的一种方法是为每个用户使用单独的私人频道。

示例

  • 游戏开始

    1. 用户 A 连接到名为 user_a_incoming_moves 的私人频道
    2. 用户 B 连接到名为 user_b_incoming_moves 的私​​人频道

当用户 B 移动时,您会在只有用户 A 连接到的 user_a_incoming_moves 私人频道上广播该动作。

当用户 A 移动时,您会在只有用户 B 连接到的 user_b_incoming_moves 频道上进行广播。

这将防止任何人通过发送恶意动作。

您可以在Private Channel Wiki 中阅读有关私人频道的更多信息。

【讨论】:

  • 刚刚注意到您已经在原始示例中使用了私人频道。我想我应该只保留“为每个用户使用单独的频道”的答案。对不起,冗余。
猜你喜欢
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多