0

首先,如果有一个真正的、官方的方式让 flash/flexNetConnection篡夺周围网页的 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 系统,并且没有做任何不寻常的事情。

4

2 回答 2

0

到目前为止没有任何回应,所以我能做的最好的就是确认它实际上确实有效。有关如何设置 Flex Builder 以编写与 Django 页面模板通信的 html-wrapper 的详细信息,请参阅我的另一篇文章。以上是使用上述组合完成的,加上:

做了一个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 上。

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

于 2010-08-25T21:35:30.583 回答
0

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

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

于 2011-06-03T20:19:29.587 回答