2012-08-14 65 views
1

我正在编程Android应用程序并希望定义房间。房间可以容纳某些游戏的所有用户。这就像有4名玩家的扑克,每个房间可容纳4名用户。我也想使用rabbitmq来实现可伸缩性和可定制性。问题是Android应用程序使用相同的用户名:密码将所有用户连接到RabbitMQ服务器(特定的虚拟主机)。RabbitMQ - 游戏室和安全注意事项

我想我担心的是一个用户可能能够从不同的队列,它应该读/写消息。有多种解决方案并不理想:

  1. 使用在每个Android应用程序不同的用户:这个真不能做,因为Android市场不允许用于下载它的每个用户不同的应用程序。无论如何,这是一个愚蠢的想法。

  2. 设置适当的访问控制:http://www.rabbitmq.com/access-control.html。我想这不会阻止恶意攻击者读取/写入它无法访问的队列的消息。

  3. 设置适当的路由的键:我想,如果每个用户创建另一个队列从它可以读取消息和发布的消息以特别定义的队列,这是可行的。但我猜这个问题是一样的,因为用户将使用相同的用户名连接到RabbitMQ:password:因此,该用户可以读取所有队列并根据访问规则写入它们。

我的问题是:如何让攻击者读/写队列,只代表他目前加入的房间,并阻止访问其他队列?

回答

2

也许我不理解应用程序太清楚,但在我的经验RabbitMQ的通常用在后端,例如,同时建立与数据库和应用服务器等松耦合实体的分布式系统。消息队列是异步应用程序设计的重要工具,每个消息队列理论上都可以由RabbitMQ生成为一个独立的进程,这使得它非常具有可扩展性。

你是暗指你的问题似乎更像是为用户提供访问控制机制是什么。我会在系统的前端看到这一点。例如,在将传入消息传递给消息传递队列之前,对传入消息进行过滤机制。您甚至可能希望通过每个用户的费率控制来考虑DoS预防。

干杯!

+1

我想要使用以下内容:http://simonwdixon.wordpress.com/2011/06/03/getting-started-with-rabbitmq-on-android-part-1/。我想这使它成为前端系统,但没关系。用户仍然使用相同的用户名:密码连接到RabbitMQ。如果您能提出更准确/更准确的答案,我会接受您的答案。 – eleanor 2012-08-14 15:36:26

+0

那么,这个例子并不涉及访问控制,一般来说,如果交换队列是公开访问的,那么任何具有队列路由键的人都可以(应该是IMO)将消息发布到队列中。 – Sachin 2012-08-14 17:40:35

+0

那么,这个例子并没有提到访问控制,一般来说,如果交换队列是公开访问的,那么任何具有队列路由键的人都可以(应该是IMO)将消息发布到队列中。 IMO的博客文章根本不考虑安全性。考虑一个HTTP服务器作为访问控制机制的中介。需要考虑的另一件事 - 你可能不需要RabbitMQ连接到客户端连接 - 它需要TCP端口在网络中打开 - 防火墙可能会阻止客户端和RabbitMQ服务器之间的底层TCP连接。坚持到客户端服务器的HTTP。 – Sachin 2012-08-14 17:51:25

2

我在扑克应用自己的工作=)

我依靠像阿卡/演员(签出二郎)根据流量在流媒体网络插座,并希望它的作品了(还是那种担心安全网络套接字)。

这就是说,我也在考虑的RabbitMQ用于接收玩家行动。我不认为你想永远暴露的兔子队列的用户名或密码。事实上,你可能甚至不希望外部世界可以访问队列服务器。

相反,建立一些服务器,您的用户可以建立连接。这将是Android客户将与之交谈的你的“前端”。每个用户将通过安全的TCP连接连接到服务器,然后登录到您的系统。这是用户将拥有自己的用户名和密码的地方。如果验证成功,请保持套接字活动(这是我对TCP的了解很弱的地方),然后将用户信息与此套接字相关联。

当一个玩家做出一个动作时,比如折叠或抬起,通过安全的TCP连接将他们的动作发送到你的“前端”(这个连接应该仍然被建立)。然后,“前端”检查哪个用户连接到此套接字,然后向该队列发布消息,该消息将理想地包含用户标识,所采取的操作以及表ID。换句话说,唯一允许进入队列的IP就是你的前端服务器,前端服务器只使用兔子队列中的单个用户名/密码。

这是由你来处理队列消息的交换和路由消息到正确的表(或确保表只处理它负责的消息 - 这就是为什么我现在爱阿卡正确:)一旦消息到达表中,请验证消息中的用户标识是实际所处的用户标识,然后根据表的状态验证发送的操作是否可接受。例如,如果我收到一个CHECK请求,并且用户只能打CALL/FOLD/RAISE,那么我只会回复说无效操作或只是丢掉整个消息。

不要让公众进入队列,并且始终确保您没有安全漏洞,特别是如果您开始处理实际货币。

希望这有助于...

编辑:我只是想明确。任何时候客户做出行动,他们只需要发送行动和表格ID或任何你需要的信息。不要让他们发送他们的用户ID或任何用户特定的信息。您的“前端”服务器应根据请求进入的套接字自动关联用户标识。如果他们提交任何用户信息与他们的请求,它可能是一个好主意,记录它,然后扔掉数据。我会记录它,只是因为我不喜欢试图欺骗的人,而这可能是他们在向您发送意外数据时所做的。

+0

谢谢兄弟,这正是我所寻找的;逐步在扑克游戏客户端中进行事件流程。我正在考虑使用ZeroMQ,有什么想法? – Mark 2013-08-01 10:59:18