javascript - Facebooksigned_request 数据和一些安全问题

标签 javascript facebook flash html

我们刚刚开发了一个小型 Facebook 谜题,人们可以从我们的客户那里赢得一些礼物。我想问几个问题,因为尽管尝试了很多事情,但我仍然陷入困境。首先我想写下我们所拥有的内容,然后解释我们的问题。

到目前为止我们做了什么:

  • 应用程序根 (/) 检查 POST 参数中的signed_request,从中提取信息以查看我们是否已将登录用户注册到数据库中。此检查还用于了解请求是否从 Facebook 发送,以防止来自 Facebook 外部的请求。 (将写出我们为什么想要这个)

  • 应用程序成功呈现后,Facebook JS API 就会启动,进行检查并设置 fbsr cookie。我们在处理 ajax 请求时使用该 cookie 信息来检查该请求是否确实属于登录用户(例如:为用户发送的分数属于登录用户)。

  • 我们实现了 CSRF 保护和其他保护来检查请求是否是 POST,更具体地说是 AJAX 请求,如果不是,则返回 40x。

问题:

  • 尽管我做了一些检查来防止欺骗分数,但我想不出一种方法,可以让登录用户通过简单地调用与真实分数相同的 JS 代码来提高自己的分数。我们只是忽略了这一点一段时间,直到我们发现有些人似乎利用了这个错误。

  • 我想到的一种方法是忽略除来自 Facebook 之外的所有请求。由于 ajax 请求被阻止(跨站点),我们应该是安全的。然而,这导致了另一个问题,一旦我们将用户重定向到例如一旦用户尝试返回,排行榜上的signed_request数据就会丢失,我们的索引页会返回40x,因为我们的应用程序认为用户尝试在Facebook之外访问我们的应用程序。

我希望我已经清楚地说明了我们的问题。游戏时间由Flash计算(游戏在AS3中编程)并通过JavaScript方法发送到服务器端。我们本来可以在 Flash 中完成,但这只会阻止我们的问题变得微不足道。毕竟,如果我们用 HTML5 实现游戏,我们也会遇到同样的问题。

欢迎任何想法、建议,感谢您的反馈!

最佳答案

这是一个设计错误。您在客户端计算分数,然后将其发送到服务器。服务器无法验证分数是否正确。这总是可以被聪明的用户伪造。

永远不要计算可以为用户在客户端带来优势的事情。客户端是邪恶的。客户端上的所有内容都可以被操纵 - 无论您多么努力。

在服务器上计算您的分数并仅使用客户端来显示它们。所有其他解决方案都是可破解的。

关于javascript - Facebooksigned_request 数据和一些安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8660645/

相关文章:

django - Facebook FB.logout 在 IE 中不起作用

javascript - React native - 不能返回简单的函数?意外的标记?

javascript - python调用flash加载html页面失败

javascript - Turbolinks 回调完全加载的页面

javascript - css从右到左变换动画

javascript - 加载全屏/最小化网页设计

javascript - 如何在不构建 "audio visualizer"的情况下将 JavaScript 动画与歌曲的节奏同步?

android - 在 android 中安装 facebook 应用程序时出现 Facebook 登录问题

flash - 更改默认项目保存类型CS5.5

apache-flex - 如何使用 Flash (AS3) 从远程域调用 Flex SWF?