【问题标题】:Facebook signed_request data and some security concearnsFacebook 签名请求数据和一些安全问题
【发布时间】: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 实现游戏,我们也会遇到同样的问题。

非常欢迎任何想法和建议,并感谢您的反馈!

【问题讨论】:

标签: javascript facebook flash html


【解决方案1】:

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

永远不要计算可以在客户端为用户带来优势的事物。客户端是邪恶的。客户端的一切都可以被操纵——不管你怎么努力。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多