actionscript-3 - 漏洞? AIR 中的 LoaderInfo getLoaderInfoByDefinition 安全沙箱违规

标签 actionscript-3 actionscript air

此问题特定于 Adob​​e 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 实例

第二次编辑 - 我什至正在考虑接受一个链接,我可以在其中将错误发布到 Adob​​e 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/

相关文章:

actionscript-3 - AS3在Haxe中删除字典[key]

flash - AS3 - 让鼠标针对 child 一层深

flash - 使用 Actionscript 3 连接到数据库

javascript - 从 Flash 到 Javascript OOP 对象的 ExternalInterface 调用

javascript - 生成加权随机数

android - 寻找Flash Android AS3教程

android - 如何在 Android 设备上找到 AIR 应用程序可用的实际区域?

javascript - 如何在 JavaScript 或 AS3 中将数组拆分为单词,同时将方括号内的单词保持在一起?

actionscript-3 - 无法创建功能以非常快(以毫秒为单位)在 Tone 上上下调整音量

windows - U 盘上的 Adob​​e Air App EXE