2011-04-26 54 views
1

我正在寫一個Facebook畫布webapp,執行登錄(使用urllib)到第三方網站並執行操作代表用戶。這意味着我有2個帳戶;用戶使用我的web應用程序的帳戶(通過facebook)以及應用程序用來代表他們執行登錄的帳戶(使用者提供的用戶/密碼詳細信息)。django&facebook:facebook webapp的安全與設計,代表用戶執行第三方登錄

我顯然不想在數據庫中使用明文密碼。但我也不希望用戶每次執行操作時都必須輸入密碼。我希望他們在註冊時輸入一次密碼,並且我想對密碼進行加密,但是我要加密哪些內容? 任何獲得訪問權限(即無用)的任何人都可以訪問服務器上的任何密鑰,因此我正在考慮通過Facebook API對其進行加密。

當用戶登錄(並將應用程序的訪問令牌提供給應用程序)時,應用程序可以通過API請求該值,並使用此值對其第三方密碼進行加密/解密。如果沒有用戶登錄到應用程序,任何有權訪問服務器的人都將無法發出此請求。 (這仍然意味着有人在服務器上窺探可能會獲得登錄用戶的第三方密碼,但任何獲得一次性訪問數據庫的人都看不到密碼。)這是一廂情願嗎?

+0

第三方網站是否不提供OAuth訪問權限?因爲這解決了你的大部分問題...... – 2011-04-26 14:21:36

+0

沒有,根本沒有API,所以這就是爲什麼我必須使用urllib來本質上屏幕刮擦和執行登錄POSTS等 – 2011-04-26 14:25:32

+0

當您登錄時,此網站是否放入cookie?你可以使用這種機制,所以他們只需要在下次cookie過期時再次登錄? – dwarfy 2011-04-26 15:39:03

回答

3

您也可以使用服務器上的密鑰對其進行加密。如果任何人獲得訪問您的服務器,他們將擁有他們需要檢索密鑰的所有內容,即使您從Facebook獲得密鑰。

我認爲您可以做的最好的方法是將密鑰存儲在您的網絡服務器不可用的位置,但該位置可用於您的腳本。至少確保你不把密鑰存儲在數據庫中。

無論你做什麼以外的事情都只是通過默默無聞的安全。這裏的關鍵是讓你的服務器保持安全,以便沒人能夠訪問它。

0

我想你可以只在客戶端存儲登錄,在某種local storage,並從JS中的客戶端做所有與第三方相關的操作。

這當然需要在你的應用程序的體系結構上進行一些改變,如果你想從你的服務器完成所有這些工作,但肯定有這種可能,你可以事件讓客戶端JS在服務器發送數據到你的服務器之後您可以記錄與第三方互動的數據。

而且它對客戶

我知道你不標記與JavaScript的問題,你似乎想的服務器解決方案純正分配負載的優勢,但它似乎是最好的解決方案給我。用戶保留其數據..

0

通過默默無聞的安全可能是你最好的選擇。也許實現一個算法來使用標準的東西(比如當前的日期時間)來生成密鑰。您可以將日期存儲在數據庫中,並使用它來使用自己的算法生成密鑰。