[英]Flash + pyAMF + Django session cookie security
首先,如果存在一種真正的,正式的方式來使Flash / Flex的NetConnection
篡改周圍網頁的會話/ cookie狀態,那么,如果用戶已經登錄,則無需再次提供憑據。要建立AMF連接,請立即停止我並發布正式答案。
除非如此,否則我假設沒有,因為我已經搜索過了,而且似乎不存在。 我已經構想了一種方法,但是需要一些關於它是否安全的反饋。
ExternalInterface
調用Java來獲取該randomcookie位置的值,並刪除該cookie。 NetConnection
,並將該randomcookie作為參數(數據,而不是url中)傳遞給login-using-cookie rpc 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.