此问题特定于 Adobe AIR ActionScript/Flash 应用程序。我花了相当多的时间研究这个问题,并不断寻找有关在浏览器中运行时 Flash Player 安全模型的讨论,其中可以通过多种方式缓解 SWF 加载问题(从同一域加载、使用 crossdomain.xml 文件)等)或对于 AIR HTML 应用程序,其中 JavaScript 安全模型通过其每帧沙箱和沙箱桥方法进行讨论。我相信我的问题有所不同。
首先是一些代码。为了进行演示,我创建了一个非常简单的 Flex 应用程序 (LoaderInfoTest.mxml):
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="onCreationComplete(event)">
<mx:Script>
<![CDATA[
import flash.display.LoaderInfo;
import flash.system.ApplicationDomain;
import flash.utils.getQualifiedClassName;
import mx.events.FlexEvent;
public function onCreationComplete(event:FlexEvent):void
{
// the following line of code throws an exception
var info:LoaderInfo = LoaderInfo.getLoaderInfoByDefinition(this);
}
]]>
</mx:Script>
</mx:WindowedApplication>
...和 application.xml 描述 rune 件 (LoaderInfoTest-app.xml):
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/1.5.2">
<id>LoaderInfoTest</id>
<filename>LoaderInfoTest</filename>
<name>LoaderInfoTest</name>
<version>v1</version>
<initialWindow>
<content>LoaderInfoTest.swf</content>
</initialWindow>
</application>
我使用 Flash Builder 4 Beta 构建此程序,但我认为使用 SDK 命令行工具时问题仍然存在。从 Flash Builder 中或通过命令行执行此操作时:
> adl LoaderInfoTest-app.xml .
我收到一个弹出窗口,但有此异常:
Security sandbox violation: caller app:/LoaderInfoTest.swf cannot access LoaderInfo.applicationDomain owned by app:/LoaderInfoTest.swf. at flash.display::LoaderInfo$/getLoaderInfoByDefinition() ...
我不明白为什么 SWF 无法访问其自身拥有的 LoaderInfo.applicationDomain 属性(可能是 protected 或内部属性)。 The documentation for LoaderInfo.getLoaderInfoByDefinition指出如果“调用者没有在本地受信任的沙箱中运行”,则可能会引发 SecurityError。除非我真的对 AIR 安全模型有严重误解,否则本地 SWF 会以完全信任的方式运行 ( application sandbox )。那么,为什么这不起作用呢?这是 AIR 运行时中的错误吗?.
我应该注意到,在不同的场景中,当在 Flash 播放器中将这段代码作为纯 Flash(而非 AIR)应用程序运行时,它确实可以工作。
最好的答案是我可以更改某种配置或设置以使其工作(也许在应用程序描述符中?)...或者指出我在哪里犯了错误。第二好的答案将是解释为什么这永远行不通的明确来源。
第一次编辑 - 在有人指出之前:我知道在 onCreationComplete
方法中,this.loaderInfo
使我可以访问当前的LoaderInfo
实例。我这里的例子是我能想到的最简单的例子来演示这个“问题”。我想要使用 LoaderInfo.getLoaderInfoByDefinition(this)
的上下文不是 DisplayObject
实例。
第二次编辑 - 我什至正在考虑接受一个链接,我可以在其中将错误发布到 Adobe AIR 的问题跟踪器作为答案。公共(public) Flex 问题跟踪器不算数,因为这不是 Flex 问题。
第三次编辑 - 显然,“本地可信沙箱”和“AIR 应用程序沙箱”之间存在差异,但(其中一些)这些差异似乎没有意义,我现在考虑它们是一个错误,至少在这个问题的上下文中,特别是因为它在 Flash Player 中工作。
最佳答案
文档中正确的说法是 getLoaderInfoByDefinition
仅适用于 localTrusted sandbox
中的内容。尽管 AIR 应用程序内容具有许多权限,但它不在 localTrusted
中,因此无法使用 API。
但是,添加对应用程序内容的访问权限当然是一个合理的请求。
作为解决方法,您可以通过在 localTrusted sandbox
中加载另一个 SWF 在 AIR 中使用此 API(和 Sampler API)。为此,您需要将该文件添加到受信任列表之一,并使用 file://URL
(而不是 app://
)加载该文件。 localTrusted
和应用程序内容可以通过多种方式进行通信。
关于actionscript-3 - 漏洞? AIR 中的 LoaderInfo getLoaderInfoByDefinition 安全沙箱违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2015288/