【问题标题】:Flash + pyAMF + Django session cookie securityFlash + pyAMF + Django 会话 cookie 安全性
【发布时间】:2011-04-02 23:23:45
【问题描述】:

首先,如果有一个真正的官方方式让 flash/flex 的NetConnections 篡夺周围网页的 session/cookie 状态,这样如果用户已经登录,他们就不需要要再次提供凭据以建立 AMF 连接,请立即阻止我并发布官方答案。

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

  1. 由于 django 中间件,访问 flash 对象的包装页面将始终转到安全 https
  2. 当页面视图在 Django 中加载时,它会创建一个“会话别名”对象,该对象具有一个唯一键,该键指向当前正在运行的会话(其中有人表面上已登录)
  3. 该会话别名模型被保存,该密钥被放入一个 cookie 中,该 cookie 的密钥是另一个随机字符串,称为 randomcookie
  4. 该 randomcookie 键名作为上下文变量传递并作为 flashvar 写入 html 到 swf
  5. swf 也只能通过 https 加载
  6. flash 应用程序使用ExternalInterface 调用 java 来获取该 randomcookie 位置的值,并删除该 cookie
  7. 然后它创建一个NetConnection 到一个安全的服务器 https 位置,将该 randomcookie 作为参数(数据,不在 url 中)传递给 login-using-cookie rpc
  8. 在网关端,pyamf 查找会话别名并获取它指向的会话,并据此登录用户(并删除别名,因此不能重复使用)
  9. (网关请求还可以将会话 cookie 和 session.session_key 设置为已知的会话 ID,但我可以让它创建一个全新的会话密钥……我假设这样做应该会正确影响响应以便它包含正确的会话密钥)
  10. 此时,flash 端返回的 cookie 值应该坚持NetConnection,以便进一步的调用被验证(如果连接使用用户名和密码以正常方式进行验证,这肯定有效,所以我认为这个是一个安全的赌注,测试很快就会证明或反驳这一点)

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

【问题讨论】:

    标签: django apache-flex session cookies pyamf


    【解决方案1】:

    到目前为止,对此没有任何回应,所以我能做的最好的事情就是确认它实际上确实有效。有关如何设置 Flex Builder 以编写与 Django 页面模板通信的 html-wrapper 的详细信息,请参阅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 )
    

    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。

    如果人们提供任何进一步的信息,我们将不胜感激,特别是如果有关于此安全方面的真实反馈......

    【讨论】:

      【解决方案2】:

      IE 不允许在本地开发中访问 c​​ookie,但如果您发布 SWF 并放在域上,它应该像其他浏览器一样拾取会话。使用 Firefox 3.6 在本地构建您的 flex 应用程序。

      在 IE8 中测试,Firefox 在带有 NetConnection 的 Flex 3 上使用 pyamf 网关。网关功能用@login_required 装饰

      【讨论】:

        猜你喜欢
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 2010-10-14
        • 2012-04-15
        • 2020-04-17
        • 2023-03-12
        • 2018-10-10
        相关资源
        最近更新 更多