2010-08-24 102 views
0

首先,如果存在一種真實的官方方式讓flash/flex的篡位周圍網頁的會話/ cookie狀態,以便如果用戶已經登錄,他們不需要再次提供憑證來設置AMF連接,請立即停止併發布正式答案。Flash + pyAMF + Django會話cookie安全性

除了這個,我假設沒有,因爲我已經搜索,它似乎不存在。我已經制定了一個這樣做的方法,但需要一些反饋意見,以確定它是否安全。

  1. 訪問的包裝,網頁的Flash對象總是會去安全的HTTPS由於Django的中間件
  2. 當頁面視圖在Django加載,它創建了一個獨特的密鑰的「會話別名」對象指向正在使用的當前會話
  3. 保存該會話別名模型,並將該密鑰放入Cookie,其密鑰是另一個隨機字符串,將其稱爲randomcookie
  4. 該randomcookie密鑰名稱作爲上下文變量傳遞並作爲flashvar寫入到html中swf
  5. SWF文件也被加載只能通過HTTPS
  6. 閃存應用程序使用ExternalInterface來調用java在那個randomcookie位置搶的價值,同時也刪除了Cookie
  7. 然後,它會創建一個NetConnection到安全服務器HTTPS的位置,將該randomcookie作爲參數傳遞給login-using-cookie rpc
  8. 在網關側,pyamf查找會話別名並獲取它指向的會話,然後登錄到基於用戶的用戶(並刪除別名,所以它不能被重用)
  9. (並且網關請求還可以設置會話cookie和session.session_key到已知的sess離子ID,但我可以讓它創建一個全新的會話密鑰......我假設這樣做會正確地影響響應,以便它包含正確的會話密鑰)
  10. 此時,返回的cookie值閃存端應該堅持NetConnection,以便進一步調用通過身份驗證(如果連接使用用戶名和密碼以通常方式進行身份驗證,這肯定有效,所以我認爲這是一個安全的選擇,測試很快就會證明或反駁這一點)

那麼,這是不安全的,還是這將正常工作?據我所知,由於html頁面被保證在ssl上,所以密鑰和cookie數據應該被加密並且不能被竊取。然後,其中的信息應該安全地使用一次,基本上是臨時密碼,通過ssl再次發送,因爲網關也是https。之後,它通過https使用正常的pyAMF系統,並且不會做任何不尋常的事情。

回答

0

到目前爲止沒有迴應,所以我能做的最好的事情就是確認它確實在身體上有效。有關如何設置Flex Builder來編寫與Django頁面模板通信的html-wrappers的詳細信息,請參閱my other post。以上用的是前述的組合來實現,以及:

製造一個SessionAlias模型:

class SessionAlias(models.Model): 
    alias = models.CharField(max_length=40, primary_key=True) 
    session = models.ForeignKey(Session) 
    created = models.DateTimeField(auto_now_add=True) 

彎曲點到一個Django頁面經由視圖負載包含:

s = SessionAlias() 
s.alias = SessionStore().session_key // generates new 40-char random 
s.session = Session.objects.get(session_key=request.session.session_key) 
s.save(); 
randomcookie = SessionStore().session_key // generates new 40-char random 
kwargs['extra_context']['randomcookie'] = randomcookie 
response = direct_to_template(request, **kwargs) 
response.set_cookie(randomcookie, value=alias) 

在flex html-wrapper,其中randomcookie是查找別名的位置:

<param name="flashVars" value="randomcookie={{randomcookie}}" /> 

applicationComplete,我們得到randomcookie並找到別名,並登錄使用:

var randomcookie:String = this.parameters["randomcookie"]; 
// randomcookie is something like "abc123" 
var js:String = "function get_cookie(){return document.cookie;}"; 
var cookies:String = ExternalInterface.call(js).toString(); 
// cookies looks like "abc123=def456; sessionid=ghi789; ..." 
var alias:String = // strip out the "def456" 
mynetconnection.call("loginByAlias", alias, successFunc, failureFunc); 

這反過來又訪問這個PyAMF的網關RPC:

from django.contrib.auth import SESSION_KEY, load_backend 
from django.contrib.auth.models import User 
from django.contrib import auth 
from django.conf import settings 
def loginByAlias(request, alias): 
    a = SessionAlias.objects.get(alias=alias) 
    session_engine = __import__(settings.SESSION_ENGINE, {}, {}, ['']) 
    session_wrapper = session_engine.SessionStore(a.session.session_key) 
    user_id = session_wrapper.get(SESSION_KEY) 
    user = User.objects.get(id=user_id) 
    user.backend='django.contrib.auth.backends.ModelBackend' 
    auth.login(request, user) 
    a.delete() 
    return whateverToFlash 

而在這一點上,在flash/flex側,該特定mynetconnection保留了會話cookie狀態,可以進行未來呼叫,以便在網關內部,request.user是首先登錄到網頁的正確驗證用戶。

再次請注意,flex的運行/調試設置必須使用https以及NetConnection的網關設置。當發佈這個時,我必須確保已通過身份驗證的用戶繼續使用https。

任何人的進一步信息,將不勝感激,尤其是如果有對這個安全方面真實的反饋...

0

IE不授予訪問到本地開發cookies,但如果你發佈的SWF和放在一個域上,它應該像其他瀏覽器一樣提取會話。使用Firefox 3.6在本地構建您的flex應用程序。

在IE8中測試,Firefox在NetConnection上使用Flex 3上的pyamf網關。網關功能用@login_required裝飾