簡體   English   中英

Flash + pyAMF + Django會話cookie安全

[英]Flash + pyAMF + Django session cookie security

首先,如果存在一種真正的,正式的方式來使Flash / Flex的NetConnection篡改周圍網頁的會話/ cookie狀態,那么,如果用戶已經登錄,則無需再次提供憑據。要建立AMF連接,請立即停止我並發布正式答案。

除非如此,否則我假設沒有,因為我已經搜索過了,而且似乎不存在。 我已經構想了一種方法,但是需要一些關於它是否安全的反饋。

  1. 由於django中間件,訪問Flash對象的包裝頁面將始終轉到安全的https
  2. 在Django中加載頁面視圖時,它會創建一個具有唯一鍵的“會話別名”對象,該對象指向正在運行的當前會話(表面上有人在其中登錄)
  3. 保存該會話別名模型,並將該密鑰放入另一個密鑰為另一個隨機字符串的cookie中,將其稱為randomcookie
  4. 該randomcookie密鑰名稱作為上下文變量傳遞,並作為Flashvar寫入html到swf
  5. 瑞士法郎也僅通過https加載
  6. Flash應用程序使用ExternalInterface調用Java來獲取該randomcookie位置的值,並刪除該cookie。
  7. 然后,它創建到安全服務器https位置的NetConnection ,並將該randomcookie作為參數(數據,而不是url中)傳遞給login-using-cookie rpc
  8. 在網關端,pyamf查找會話別名並獲取它指向的會話,並根據該別名登錄用戶(並刪除該別名,因此無法重復使用)
  9. (並且網關請求還可以將會話cookie和session.session_key設置為已知的會話ID,但是我可以讓它創建一個全新的會話密鑰...我假設這樣做會適當地影響響應,以便它包含正確的會話密鑰)
  10. 此時,在閃存端返回的cookie值應保留在NetConnection以便對進一步的調用進行身份驗證(如果使用正常方式使用用戶名和密碼對連接進行身份驗證,則肯定可以,因此,我認為這是一個安全的選擇,測試將很快證明或反對這一點)

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

到目前為止,對此還沒有任何回應,所以我能做的最好的事情就是確認它確實在物理上起作用。 有關如何設置Flex Builder來編寫與Django頁面模板進行通信的html包裝程序的詳細信息,請參閱我的其他文章 以上是結合使用上述各項以及以下內容完成的:

制作了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 )

Flex指向通過包含以下內容的視圖加載的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。

人們的任何進一步信息將不勝感激,特別是如果對此安全性方面有真實反饋的話……

IE不允許在本地開發中訪問cookie,但是如果您發布SWF並放入域中,則它應該像其他瀏覽器一樣拾取會話。 使用Firefox 3.6在本地構建Flex應用程序。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM