【问题标题】:AIR: Security Sandbox Violation when using remote imagesAIR:使用远程图像时违反安全沙箱
【发布时间】:2009-09-08 16:24:59
【问题描述】:

下面的代码是简化的例子

我正在开发一个 AIR 应用程序(使用 Flex),它从远程 Web 服务器加载其几个图像。图像显示正常,但是,每当我操作保存远程加载图像的容器时,我的控制台中都会出现错误:

*** Security Sandbox Violation ***
SecurityDomain 'http://www.google.com/intl/en_ALL/images/logo.gif' tried to access incompatible context 'app:/sandbox_test.swf'

图像似乎没有受到影响,但我不喜欢显示我不理解的错误。下面是一个示例应用程序来说明问题:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication width="500" height="500" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:HDividedBox width="100%" height="300" horizontalCenter="0" verticalCenter="0" backgroundColor="#000000" liveDragging="true">
        <mx:Image source="http://sstatic.net/so/img/logo.png"/>
        <mx:Image source="http://www.google.com/intl/en_ALL/images/logo.gif"/>
    </mx:HDividedBox>
</mx:WindowedApplication>

如果使用 HDdivedBox 上的拖动器进行拖动,则会出现安全错误。

我查看了 AIR 的一些安全类/安全沙箱内容,但默认情况下 AIR 应该可以访问网络资源(我认为这就是加载图像的原因)。使用 Security.allowDomain("www.google.com") 不是 AIR 中的选项 - 它只会引发 SecurityError。

有谁知道是什么原因造成的,或者如何解决? (或者也许它只是一个 Flex/AIR 错误?)。

另外 - 有没有人知道当错误发生时是否有办法中断,以便我可以追踪到导致它的根本操作?

【问题讨论】:

  • 您是否使用调试器来确定安全错误何时真正触发?是在绘图阶段吗?
  • 当错误触发时调试器实际上并没有中断,它们只是打印到控制台。目前尚不清楚如何追踪它们的来源

标签: apache-flex security air


【解决方案1】:

此安全沙盒问题特定于拖动其中包含图像组件的 UIComponents。 Image 组件引用外部图像。我到处寻找,我遇到的每个帖子都没有得到答复,这通常意味着它是一个错误。

我的盗版解决方法?图像下载到 Image 组件后,将其缓存为位图,并将 Image 组件源重新分配给位图。这为我解决了这个问题:

private function authorImageLoadComplete(event:Event):void {
    var bp:Bitmap = dupeImage(authorImage);
    authorImage.source=bp;

}

private function dupeImage(source:Image):Bitmap {
    var data:BitmapData = Bitmap(source.content).bitmapData;
    var bitmap:Bitmap = new Bitmap(data);
    return bitmap;
}

然后你的 UIComponent 中的图像标签:

<mx:Image id="authorImage" complete="authorImageLoadComplete(event)"></mx:Image>

祝你好运

【讨论】:

    【解决方案2】:

    对于 Flex 4,尝试将顶级 WindowedApplicationuseNativeDragManager 属性设置为 false,如下所述:http://cookbooks.adobe.com/post_How_do_you_make_a_Spark_custom_itemRenderer_with_a-16532.html

    【讨论】:

      【解决方案3】:

      当您不在 Debug 中运行时,是否会显示这些图像?问题是域没有 crossdomain.xml 文件设置来允许 Flash 中的图像。

      http://www.google.com/crossdomain.xml:

      <?xml version="1.0"?>
      <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
      <cross-domain-policy>
        <site-control permitted-cross-domain-policies="by-content-type" />
      </cross-domain-policy>
      

      您可能应该只抓取图像并将它们放在应用程序的资产中,或者放在您控制的域上,并且可以正确添加允许内容的 crossdomain.xml。 Security.allowDomain 不会产生您正在寻找的影响。 This article 有我读过的关于跨域安全的最佳解释。

      请参阅下面 ryanstewart 的评论。以上是 AIR 应用程序的废话。

      【讨论】:

      • 这与 AIR 无关。当您在桌面上时,您遵循的是一组不同的规则。 @Chris,你的应用程序叫 sandbox_test 吗?这就是引用 app:/sandbox_test.swf 文件的原因吗?
      • 是的 - 我制作的测试应用程序称为 sandbox_test,只是为了确保问题不是我的真实应用程序难以理解的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      相关资源
      最近更新 更多