Flash Player会自动传输会话cookie吗?

18

在Flash电影中无法访问HTTP cookies,但我已经多次阅读到Flash Player应该自动处理会话cookies。然而,我找不到任何关于此的文档,并且使用默认的JSESSIONID cookie将我的Flex客户端与Struts后端一起运行时并没有起作用。

那么,Flash Player是否处理会话cookies?如果是,我该如何设置它?

4个回答

6
Flash发送的HTTP请求通过浏览器发送,因此cookie会自动传输。实际上,我目前正在处理一个网站,该网站在HTML页面中处理登录(因此设置会话cookie),然后将用户转发到仅限Flash的页面。Flash页面使用URLLoaderURLRequest向服务器发送大量请求,我能够验证每个请求的会话cookie。
也可以使用ExternalInterface.call()从Flash访问HTTP cookie。确保SWF嵌入代码中的allowScriptAccess设置为适当的值。
var cookies:String = ExternalInterface.call("function()
    {
        return document.cookie;
    }()");

更新:我没有尝试过在Flash中登录,但你可能是对的 - Flash可能会忽略Set-Cookie(或全部)响应头。不幸的是,Flash也不允许我们访问响应头。但由于可以在AJAX响应中访问响应头(使用xhr.getResponseHeader),因此您可以使用ExternalInterface并将登录部分外包到AJAX中。在AJAX响应中获取标头并使用javascript设置cookie(根据this SO thread,浏览器将自动执行此操作)。设置后,从flash发送的后续请求将包含其中的会话cookie。
使用ExternalInterface.addCallback方法注册一个可从javascript调用的flash方法。

这是否意味着浏览器在我开始播放Flash电影之前必须拥有cookies? 我使用Flash登录,但似乎不起作用。 - Hanno Fietz
@Hanno 我还没有尝试通过Flash登录,但我认为有一个解决方法 - 请参见更新。 - Amarghosh

3

通常情况下,Flash Player通过浏览器进行网络传输,此时设置和获取cookie完全由浏览器处理。

如果一个站点发送了Set-Cookie,那应该是有效的。

您不能从Flash内容中访问响应头,就像无法从JavaScript中访问一样;这是基本安全原因。但是,有可能将来Flash Player会允许您通过Cookie API读取cookie,就像JavaScript一样。同时,ExternalInterface可以让您调用JS以读取cookie。

有一种情况下,Flash Player不会发送cookie,甚至可能发送错误的cookie。那就是当您使用FileReference.upload()时。这是一个已知的Flash Player漏洞,尽管Adobe非常难以解决,因为它涉及到NPAPI依赖项。

顺便说一句,JSESSIONID目前被认为不安全。由于浏览器会盲目发送它,而不管请求的文档属于谁,因此它容易受到CSRF攻击。大多数现代登录系统使用隐藏的表单字段或其他方法,仅使登录nonce可被域内页面访问。

希望我能告诉您为什么您特定的应用程序没有发送cookie。您是否尝试将其与全HTML版本进行比较?您是否使用数据包嗅探器监视了两个网络流?


2

这个问题是10年前提出的,但我想对未来的读者说些什么。

Flash Player不会在请求中传输默认的JSESSIONID,并且在您设置了SameSite=None的JSESSIONID cookie之前无法这样做。

我曾经遇到过JSESSIONID cookie在请求中被删除的问题,后来发现这是因为现代浏览器(chrome > 80)不允许Flash Player访问没有SameSite=NoneSecure flash的JSESSIONID cookie。

请阅读Adobe的公告here 更多关于新cookie策略的阅读:

  1. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
  2. https://medium.com/adobetech/adobe-experience-cloud-cookie-updates-for-google-chrome-19ad67cf1598
  3. https://digiday.com/media/what-is-chrome-samesite/

非常重要的是要说,这只发生在HTTPS中。 - Doston
希望你能因为在十年后写出了好的答案而获得一个徽章。 :D (也希望Flash在某个时候完全消失...) - Hanno Fietz
@hanno-fietz 谢谢,我也希望我不会再过多地使用Flash :) - Doston
非常感谢,我为此苦恼了整整一天。 - Sudarshan Tanuku
@ SudarshanTanuku 没关系。我也花了一些时间才知道那个问题。 - Doston

0

我相信这个帖子现在已经过时了,但我最近在使用ASP.NET和FileUpload时遇到了类似的问题,并根据这里的一些工作找到了一个解决方法。

我构建了一个组件,动态地将Flex对象写入页面,以便它们可以在UpdatePanels中使用。如果您想要代码,请给我发消息。为了解决在需要通过URLRequest发送身份验证cookie的页面上述问题,我将值添加为flashVars。

这段代码只适用于我的对象,但您可以理解其中的思路。

Dictionary<string, string> flashVars = new Dictionary<string, string>();     
flashVars.Add("auth", Request.Cookies["LOOKINGGLASSFORMSAUTH"].Value);
flashVars.Add("sess", Request.Cookies["ASP.NET_SessionId"].Value);
myFlexObject.SetFlashVars(flashVars);

然后在 Flex 对象中检查参数

if (Application.application.parameters.sess != null)
    sendVars.sess= Application.application.parameters.sess;
if (Application.application.parameters.auth != null)
    sendVars.au= Application.application.parameters.auth;

request.data = sendVars;
request.url = url;
request.method = URLRequestMethod.POST;

最后,在 global.asax 的 BeginRequest 中塞入 cookies。

if (Request.RequestType=="POST" && Request.Path.EndsWith("upload.aspx"))
{
    try
    {
        string session_param_name = "sess";
        string session_cookie_name = "ASP.NET_SESSIONID";
        string session_value = Request.Form[session_param_name]; // ?? Request.QueryString[session_param_name];
        if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
    }
    catch (Exception) { }

    try
    {
        string auth_param_name = "au";
        string auth_cookie_name = FormsAuthentication.FormsCookieName;
        string auth_value = Request.Form[auth_param_name];// ?? Request.QueryString[auth_param_name];

        if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
    }
    catch (Exception) { }   

}

希望这篇文章能帮助某人避免我刚刚花了6个小时来解决这个问题。Adobe已经将此问题关闭为无法解决,所以这是我的最后一招。

1
您提供的链接缺少一个字符。 这是正确的链接: http://swfupload.org/forum/generaldiscussion/98 - Roger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接