as3安全沙箱违规

时间:2012-07-11 21:17:57

标签: actionscript-3 load flash sandbox

我已经阅读了所有类似主题但没有运气,所以我发布了一个关于此错误的新问题。

我正在尝试使用以下代码从另一个swf文件加载swf文件:

var loader:Loader = new Loader()

//listen for loading progress
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);

//listen for when the load is finished
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoaderError);

//load!
var rr:URLRequest = new URLRequest("http://localhost/Gen-Tree.swf")
loader.load(rr);


function onLoaderError(event:SecurityErrorEvent) {
    trace("hi")
}

function onProgress(event:ProgressEvent):void
{
    //calculate how much has been loaded
    var percentageLoader:Number = event.bytesLoaded / event.bytesTotal;

    //use your percentage number here to drive a loader bar graphic
}

function onComplete(event:Event):void
{
    //remove listeners now that loading is done
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);

    //add loaded swf to the stage
    addChild(loader.content);

}

我收到如下错误消息:

SecurityDomain 'http://localhost/Gen-Tree.swf' tried to access incompatible context 'file:///C|/Users/Alex/Desktop/Gen%2DTree%202012/Programming/loader.swf'
*** Security Sandbox Violation ***
SecurityDomain 'http://localhost/Gen-Tree.swf' tried to access incompatible context 'file:///C|/Users/Alex/Desktop/Gen%2DTree%202012/Programming/loader.swf'
*** Security Sandbox Violation ***
SecurityDomain 'http://localhost/Gen-Tree.swf' tried to access incompatible context 'file:///C|/Users/Alex/Desktop/Gen%2DTree%202012/Programming/loader.swf'

有什么想法吗?

3 个答案:

答案 0 :(得分:10)

您正在尝试从文件系统加载外部swf,这会引发安全错误。把它放在服务器上,它应该可以正常工作,只要两个swfs在同一个域上。或者运行本地服务器并尝试使用它。

如果两个swfs不在同一个域中,则需要添加crossdomain.xml。它将在服务器根目录上运行,它看起来像这样:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy>

除非你不应该只使用*,否则会让你面临安全风险。您需要专门将其他域列入白名单。您可以详细了解跨域策略文件here

<强>更新
另外,由于加载器swf正在访问它正在加载的内容(通过loader.content),您需要为该内容swf添加安全权限(看起来像是Gen-Tress.swf):

import flash.system.Security;

Security.allowDomain("*");

值得注意的是,LoaderDisplayObject,这意味着您可以使用stage而不是addChild(loader)直接将其添加到addChild(loader.content)。通过不访问Loader的内容,您通常可以避免安全沙箱违规错误,而不必处理允许域和跨域策略。

答案 1 :(得分:4)

您可以尝试加载swf,然后使用loader.loadBytes()重新加载加载器内容。这样你就可以制作swf的bytearray克隆并绕过安全沙箱。到目前为止,它与图像的效果非常好。我在博客上解释了这个过程:http://www.inklink.co.at/blog/?p=14

图片示例如下:

function loadPicture():void
{
    var req:URLRequest = new URLRequest("YOUR_URL_HERE");
    var _picLoader:Loader = new Loader();
    _picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loader2ByteArray);
    _picLoader.load(req);
}
 
function loader2ByteArray(evt:Event):void
{
    var lInfo:LoaderInfo = LoaderInfo(evt.target);
    var ba:ByteArray = lInfo.bytes;
    reloadByteArray(ba);
}
 
function reloadByteArray(ba:ByteArray):void
{
    var reloader:Loader = new Loader();
    reloader.loadBytes(ba);
    reloader.contentLoaderInfo.addEventListener(Event.COMPLETE, reloaderComplete);
}
 
function reloaderComplete(evt:Event):void
{
    var imageInfo:LoaderInfo = LoaderInfo(evt.target);
    var bmd:BitmapData = new BitmapData(imageInfo.width,imageInfo.height);
    bmd.draw(imageInfo.loader);
    var resultBitmap:Bitmap = new Bitmap(bmd);
    addChild(resultBitmap);
}
希望它有所帮助!

答案 2 :(得分:1)

var loader_context:LoaderContext = new LoaderContext();
if (Security.sandboxType!='localTrusted') loader_context.securityDomain = SecurityDomain.currentDomain;
loader_context.applicationDomain = ApplicationDomain.currentDomain;
currentLoader = new Loader();
currentLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
currentLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
currentLoader.load(new URLRequest(baseLink + pName + ".swf"), loader_context);

也许您可以尝试向其添加loadercontext