执行Facebook身份验证:客户端和服务器端

时间:2010-08-04 13:06:38

标签: javascript flash security authentication facebook

我正在Flash(AS3)中构建一个与Facebook紧密集成的社交媒体应用程序 - 所有用户帐户都通过Facebook连接进行处理,所有Facebook连接都通过JavascriptAS3 FacebookCodeigniter API。我在后端使用{{3}}进行服务器端数据管理,其中包括通过Flash中的URLRequests跟踪网站上的用户操作和数据。

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

我考虑的一种可能性是使用客户端和服务器已知的加密方案来回传递Facebook UID,这肯定比明确传递它们更好。然而,只有一个有进取心的黑客才能有足够的时间/耐心来打破这个计划(或者反编译swf)来搞砸一切。

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

2 个答案:

答案 0 :(得分:6)

我花了很多时间试图弄清楚这个!我知道这是一个老问题,但希望它对你或者至少其他人都有用。

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

此问题的解决方案是使用存储在cookie中的信息,在用户成功登录后facebook api会丢弃。 cookie中的信息包含其中的用户信息以及唯一的签名数据。如果服务器抓取cookie的内容,并且您正确处理它,则应该弹出一个密码。这个密码应该与您和Facebook知道的应用程序密码完全匹配。如果确实如此,那么你就知道cookie(因此用户)是合法的。如果它不相同,那么你就知道有人正在尝试一些有趣的事情。

有关详细信息,您可以考虑查看以下页面: PHP - https://developers.facebook.com/docs/guides/web/#personalization Ruby - http://vombat.tumblr.com/post/835536630/ruby-version-of-facebooks-get-facebook-cookie-in-php

我还应该注意到LinkedIn和Twitter都有类似的方法。

答案 1 :(得分:1)

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

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