防止在Rails / html5游戏App中作弊(Rails 3.2 / html5 / javascript)
我想知道在下列情况下是否可以防止作弊
- 我有一个Ruby on Rails应用程序和一个Active Record数据库
- 我有玩家(模型用户),玩游戏(模型游戏),还有奖品(模特奖)。
我想要的是:
1-防止玩家欺骗/黑客赢取奖金(他赢得的奖品)
2-防止玩家在他拥有的镜头中作弊
由于用户可以赢得多个奖品并且奖品可以属于多个用户,我有很多关系:我用这个表/模型奖金列出了每个用户在游戏中赢得的所有东西(用户有很多奖金和奖品)有很多奖金)
玩家有一定数量的镜头,比方说每个用户3个。
对于1-,基本上,我猜每次用户在游戏中赢得奖品时,我都会向服务器发送一个url:mygame / com /?winning_id = 1234; game_id = 3; user_id = 6; prize_id = 4,告诉id为6的用户在id为6的游戏中以id4赢得奖品
我不希望玩家能够欺骗那个。 我怎样才能做到这一点。 任何玩家都可以使用上面的url,并以这种方式向我的服务器发送消息/动作(post)告诉他他赢了吗? 这会让它变得容易欺骗吗?
我应该加密东西/url,并使我的服务器只能理解url/邮件吗?
对于2- (镜头),我想我应该每次都向服务器端发送动作并在服务器端计算分数,但仍然不能像1-那样欺骗?
除了使用上面的palainum答案中提到的post之外,如果需要,您可以在游戏中可以编辑和显示URL的任何位置添加字符串(而不是ID)。
背景 – 我的一个应用程序中遇到了类似的问题(如果URL被更改,人们可以推断/编辑数字和作弊)。 我克服它的方法是为URL中的项生成唯一代码。
为此,我将为Winning
模型添加一个名为url_code
的字符串属性,使其成为必需和可索引的:
add_column :winning, string :url_code, :null => false, :index => true
在你的模型中添加一个after_initialize
回调:
Class Winning validates :url_code, :uniqueness => true after_initialize :create_url_code def create_url_code self.url_code=SecureRandom.hex(4) if self.url_code.nil? end
并且在使用ID的情况下将其用作参数是一个问题(在您的控制器中与此类似)……
@winning = Winning.find_by_url_code(params[:id])
此外,您可以使用user.name作为friendly_id,为您的用户URL执行相同的操作(或者如果您需要在URL中显示每个URL)。
编辑 – 只修复了我有offer_code而不是url_code的拼写错误。
你现在至少可以做两件事:
- 发送
POST
请求 – 它仍然可以作弊,但它需要更多的工作 - 创建一个模型
Win
– 并在赢得游戏后创建该类的对象。 然后在发出请求(第1点)后,您可以检查此对象是否存在。
编辑:
对不起,您已经提到过Winning
课程。 在赢得游戏后创建该类的对象,然后检查用户是否赢得了游戏(如果该表包含用户和游戏的记录)。
您还应该在游戏中存储用户的镜头,并使用独特的validation来禁止例如在一个游戏中两次拍摄。