代码之家  ›  专栏  ›  技术社区  ›  eruciform

Flash+pyAMF+Django会话cookie安全

  •  0
  • eruciform  · 技术社区  · 15 年前

    首先,如果有一个真正的,官方的方式拥有flash/flex的 NetConnection s盗用周围网页的session/cookie状态,因此如果用户已经登录,则不需要再次提供凭据来建立AMF连接,请立即阻止我并发布正式答案。

    除此之外,我假设没有,因为我已经搜索,它似乎不存在。我已经编造了一个这样做的方法,但想要一些关于它是否安全的反馈。

    1. 由于django中间件的原因,访问flash对象的包装页将始终转到安全的https
    2. 该会话别名模型被保存,并且该密钥被放置到一个cookie中,该cookie的密钥是另一个随机字符串,称之为randomcookie
    3. swf也只能通过https加载
    4. ExternalInterface
    5. 然后创建一个 到安全的服务器https位置,使用cookie rpc将该randomcookie作为参数(数据,不在url中)传递给登录名
    6. 在网关端,pyamf查找会话别名并获取它所指向的会话,然后基于该别名登录用户(并删除别名,因此它不能被重用)
    7. (网关请求还可以设置会话cookie和session.session\u键到已知的会话ID,但我可以让它生成一个全新的会话密钥。。。我假设这样做会正确地影响响应,以便它包含正确的会话密钥)
    8. 此时,flash端返回的cookie值应该与 网络连接

    那么,这是不安全的,还是能正常工作?据我所知,由于html页面保证是通过ssl的,所以密钥和cookie数据应该被加密,不能被窃取。然后,其中的信息应该是安全的,使用一次性基本上是一个临时密码,再次通过ssl发送,因为网关也是https。之后,它通过https使用普通的pyAMF系统,不做任何不寻常的事情。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Community Mohan Dere    9 年前

    到目前为止还没有任何回应,所以我能做的就是确认它确实起到了实际的作用。有关如何设置Flex Builder以编写与Django页面模板通信的html包装器的详细信息,请参阅 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 )
    

    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 )
    

    <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
    

    mynetconnection request.user 是在第一时间登录到该网页的正确身份验证用户。

    请再次注意,flex的run/debug设置必须使用https,以及的gateway设置 NetConnection . 当发布这个时,我必须确保经过身份验证的用户仍然使用https。

        2
  •  0
  •   Plahcinski    15 年前

    IE在本地开发中不允许访问Cookie,但是如果你发布SWF并将其放到域中,它应该像其他浏览器一样启动会话。使用Firefox3.6在本地构建flex应用程序。