2010-08-04 207 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類似的方法存在。

相關問題