2010-08-04 325 views
7

我在与Facebook紧密集成的Flash(AS3)中构建社交媒体应用程序 - 所有用户帐户都通过Facebook连接处理,并处理所有Facebook连接通过JavascriptAS3 Facebook API的组合。我在后端使用Codeigniter进行服务器端数据管理,其中包括通过Flash的URLRequests跟踪用户操作和网站上的数据。执行Facebook身份验证:客户端和服务器端

我的问题是,我不知道如何防止从Flash制作的服务器请求的欺骗;理论上,恶意用户可以跟踪Flash对我的服务器进行的调用,并以(例如)插入垃圾数据并将其与我的数据库中给定的Facebook用户ID相关联的方式进行再现。所有身份验证都是在客户端(通过Facebook JS API)进行的,没有服务器的干预,所以我很难搞清楚如何确保Flash和服务器之间的通话,确保用户必须通过Facebook进行身份验证才能制作出来。

我考虑的一种可能性是使用客户端和服务器已知的加密方案来回传递Facebook UID,这肯定会比传递给他们明显的更好。然而,只有一个有足够时间/耐心的有进取精神的黑客才能打破这个计划(或反编译瑞士法郎),将所有事情搞砸。

无论如何,我可能会反思这一点,但它似乎是一个重要的观点,我真的不确定最好的方法。任何反馈将不胜感激!

回答

1

这是一个合法的问题,因为您违反了CWE-603: Use of Client-Side Authentication。加密不能帮助这个站,因为恶意的客户端将能够获得任何秘密。

验证客户端的最佳方法是让Flash应用程序将information about the session发送回服务器。然后服务器必须使用诸如php api之类的东西连接回Facebook,以便服务器可以验证客户端与Facebook有效会话。这应该在每次登录时完成一次,然后您可以向Flash应用程序发出会话ID(cookie)以访问该用户的数据存储。

+0

Rook,你是指访问令牌作为客户端可用的会话信息,并且服务器可以使用它来连接到FB? – Totach 2011-02-10 15:24:34

+0

为了让您知道,您的wiki.developers.facebook链接已损坏。参考:meta.stackoverflow.com/q/101241/149820 – staticbeast 2011-08-08 22:22:33

+0

这是不正确的。虽然它是实现这一点的一种方式,但使用客户端设置的cookie(javascript)库更有效。 – MetaChrome 2012-08-09 19:40:00

6

我刚花了一大笔时间试图找出这一个!我知道这是一个古老的问题,但希望这对你仍然或至少是其他人有用。

基本问题就像你说的。如果您正在进行客户端身份验证,但您想要执行一些特定于用户的服务器端操作,则还需要安全地在系统上对用户进行身份验证。理想情况下,您希望避免让他们使用密码重新登录,因为这会是一种糟糕的用户体验。所以有人可能会试图发送UID并将其记录下来。不幸的是,这存在明显的安全风险。正如你指出的那样,任何人都可以传递一般是公共知识的UID并登录为他们不是的人。

此问题的解决方案是使用存储在cookie中的信息,该信息在用户成功登录后会被facebook api删除。 Cookie中的信息包含用户信息以及唯一的签名数据。如果服务器抓取cookie的内容,并且正确处理它,那么应该弹出一个密码。这个密码应该完全匹配你的应用密码,只有你和脸书知道。如果是这样,那么你知道cookie(以及用户)是合法的。如果不一样,那么你知道有人正在尝试一些有趣的事情。

欲了解更多信息,你可以考虑检查出这些页面: PHP - https://developers.facebook.com/docs/guides/web/#personalization 红宝石 - http://vombat.tumblr.com/post/835536630/ruby-version-of-facebooks-get-facebook-cookie-in-php

我还要指出,无论对于LinkedIn和Twitter类似的方法存在。

相关问题