【发布时间】: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