【发布时间】:2012-01-29 10:41:37
【问题描述】:
我们刚刚开发了一个小的 Facebook 谜题,人们可以从我们的客户那里赢得一些礼物。我想问几个问题,因为尽管尝试了很多事情,但我还是很困惑。首先我想写下我们所拥有的,然后再解释我们的问题。
到目前为止我们做了什么:
应用程序根 (/) 检查 POST 参数中的 signed_request,从中提取信息以查看我们是否已将登录用户注册到我们的数据库中。此检查还用于了解请求是否来自 Facebook,以防止请求来自 Facebook 之外。 (会写出我们想要这个的原因)
一旦应用程序成功呈现,Facebook JS API 就会启动,进行检查并设置 fbsr cookie。我们在处理 ajax 请求时使用该 cookie 信息来检查请求是否真的属于登录用户(例如:为用户发送的分数属于登录用户)。
我们实施了 CSRF 保护和另一种保护来检查请求是否为 POST,更具体地说是 AJAX 请求,如果不是则返回 40x。
问题:
尽管我做了一些检查以防止伪造分数,但我想不出登录用户可以通过调用与真实分数相同的 JS 代码来提高自己的分数的方法。我们只是忽略了一段时间,直到我们发现有些人似乎利用了这个错误。
我想到的一种方法是忽略来自 Facebook 之外的所有请求。由于 ajax 请求被阻止(跨站点),我们应该是安全的。然而,这导致了另一个问题,一旦我们将用户重定向到例如当用户尝试返回时,由于我们的应用程序认为用户尝试在 Facebook 之外访问我们的应用程序,因此排行榜上 signed_request 数据丢失并且我们的索引页面返回 40x。
我希望我把我们的问题说清楚了。游戏时间由 Flash 计算(游戏在 AS3 中编程)并通过 JavaScript 方法发送到服务器端。我们本可以在 Flash 中完成,但这只会阻止我们的问题变得微不足道。毕竟,如果我们用 HTML5 实现游戏,我们也会遇到同样的问题。
非常欢迎任何想法和建议,并感谢您的反馈!
【问题讨论】:
-
也许你可以在服务器端实现游戏,让客户端将他们的动作发送到服务器。我不太了解您的游戏,但我相信这是确保值得信赖的客户的唯一方法。精彩阅读:gafferongames.com/networking-for-game-programmers/…
标签: javascript facebook flash html