2011-04-20 53 views
0

我想添加锦标赛模式到我的iPhone游戏,并有一个Rails 3应用程序跟踪比赛统计。基本上,每一个比赛结束时,获胜者将被报告给我的Rails使用POST请求像3应用程序...我的Rail3应用程序如何验证来自iPhone应用程序的请求?

POST http://myrail3app.com/tourney/matchresults?winner=username 

显然,任何人都可以监测所取得的请求的URL,然后进行同样的请求在他们的电脑上一次又一次地欺骗。所以我想用一些方法在Rails 3应用上验证请求,以确保请求仅来自我的iPhone应用。你的想法?

非常感谢您的智慧!

回答

1

使用UDID由贾森提到不一定从重新发布,在桌面浏览器几次阻止别人选择列表响应。

您有几种选择,这取决于你想多么复杂获得:

一)您的应用程序和轨道服务器

b)您可以使用签名生成服务,类似于Facebook和亚马逊在其请求中处理签名的方式。

  • 您提供密钥的应用 (最有可能在你的目标C代码 的地方),并基于所有 参数HMAC 签名你与你的密钥发送应用 (见 http://www.ouah.org/ogay/hmac/)。然后使用通过 发送的参数在轨道侧生成另一个签名,并比较发送的签名 (例如,在导轨中: OpenSSL::HMAC.hexdigest('sha256', message, key))。如果2个签名 不同,则知道有人篡改了参数 。

  • 见实 (http://developers.facebook.com/docs/authentication/signed_request/) 和Amazon (http://docs.amazonwebservices.com/AWSSimpleQueueService/2007-05-01/SQSDeveloperGuide /SummaryOfAuthentication.html) 有关如何执行此操作的示例。

c)根据您是否想要在应用程序和导轨服务器之间共享其他数据,可以在导轨侧实现Oauth提供程序。

+0

谢谢,多米尼克,非常有帮助!关于HMAC方法的问题,是否需要每次发出请求时发送的参数都不相同以保证其安全?换句话说,如果我用来创建签名的唯一数据是密钥和用户名,那么来自单个用户的所有请求每次都是相同的,那么这些请求可能是伪造的,是正确的? – BeachRunnerFred 2011-04-20 01:33:14

+0

使用用户名发送时间戳。例如:一个时代价值http://mysite.com?username=foo×tamp=1303268516&signature=abc123 – Dominic 2011-04-20 03:01:29

+0

顺便说一句,你发送的签名是由密钥签名的。试图篡改参数的人如果想要更改参数(通过更改参数并根据新的参数和密钥重新生成新签名),必须知道密钥。只要确保他们没有访问密钥是啊? – Dominic 2011-04-20 03:19:02

0

你可以使网站只给iphone的id

NSString *deviceUDID = [myDevice uniqueIdentifier]; 
+2

无法用户只检查一个POST请求从他们的电话来了,然后创建从他们的计算机伪造? – BeachRunnerFred 2011-04-20 01:14:46

+0

绝对。但是这可能会发生在任如果你想加密应用程序和服务器之间的通信也是可能的。但没有什么是不可逾越的。你只需要权衡构建这类事情所涉及的工作,以及伪造的可能性和问题。你可能可以通过SSL实现一个web服务,但那还不够我的范围。 – 2011-04-20 01:26:10

相关问题