2010-08-24 68 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装饰