as3 funzione di Sicurezza Sandbox Violazione

Ho letto tutti argomenti simili già senza fortuna, quindi sono la pubblicazione di una nuova domanda su questo errore.

Sto cercando di caricare un file swf da un altro file swf utilizzando questo codice:

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);

}

e ottengo un messaggio di errore come segue:

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'

Tutte le idee?

 

3 Replies
  1. 10

    Si sta cercando di caricare l’swf esterno off del file system, che genererà errori di sicurezza. Mettere su un server, e che dovrebbe funzionare bene, purché entrambi i file swf sono sullo stesso dominio. O eseguire un server locale e provare su di esso che.

    Se i due file swf non sono nello stesso dominio, è necessario aggiungere un crossdomain.xml. Andrò sul server principale e apparirà qualcosa di simile a questo:

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

    Tranne che non si deve solo usare * come sarà aperta fino al rischi per la sicurezza. Si desidera specificamente white-list altro dominio. Si può imparare di più su cross domain policy file qui.

    AGGIORNAMENTO:

    Inoltre, dal momento che il loader swf è l’accesso al contenuto è il carico (tramite loader.content), è necessario aggiungere le autorizzazioni di protezione per il contenuto swf (guarda come si chiama Gen-Tress.swf):

    import flash.system.Security;
    
    Security.allowDomain("*");

    Vale anche la pena notare che Loader è un DisplayObject, significa che è possibile aggiungere direttamente al stage con addChild(loader) invece di addChild(loader.content). Non accedendo al Loader‘s contenuto, di solito si può evitare sandbox di sicurezza violazione di errori e non avere a che fare con permettendo domini e domini politiche.

    • In realtà io sono l’esecuzione di un locale di Wamp server. Che differenza ci sarebbe se io caricarlo da qualche parte?
    • Se si sta eseguendo su Wamp, perché sono hard-codifica di un file di sistema percorso per caricare l’SWF? Invece di file:///C|/Users/Alex..., dovrebbe essere http://localhost/loader.swf.
    • Io non sono, è il loader.swf che accede Gen-Albero.swf, non viceversa. L’istruzione di errore è fonte di confusione per questo motivo.
    • Stai aprendo il loader swf tramite Wamp? O semplicemente direttamente nel browser? L’errore di dare un percorso nel file system è dispari.
    • Se apro il loader.swf da un browser, mi compare una schermata vuota. Quando ho eseguirlo direttamente da Flash ho superiore di errori riportati. Infatti, è in qualche modo strano.
    • Ho aggiornato la risposta con un ulteriore passo che dovrete fare.
    • Sto andando provare che proprio ora, ma ho letto somwhere che mettere asterisco (*) sul allowDomain() comporta alcuni rischi. Non mi ricordo con precisione che cosa se.
    • Mettere un * nel tuo SWF significa solo che qualcuno potrebbe esternamente caricare il file SWF in un altro SWF. Mettere un * in un file di criteri interdominio potrebbe aprire fino a molti più problemi (dato che è per tutto il server). È possibile specificare il dominio effettivo invece di * se si desidera bloccare il file SWF in giù.
    • Beh, l’errore precedente è andato, ma ora ho TypeError: Error #1009: Impossibile accedere a una proprietà o a un metodo di un oggetto null riferimento. Per lo stesso codice come ho detto nel mio primo post.
    • cerchiamo di continuare questa discussione in chat

  2. 4

    Si potrebbe provare a caricare il file swf e di ricaricare i caricatori contenuto con caricatore.loadBytes(). che modo è fare un bytearray clone del file swf e bypassare la sandbox di sicurezza. fino ad ora funziona abbastanza bene con le immagini. Ho spiegato il processo sul mio blog: http://www.inklink.co.at/blog/?p=14

    un esempio con le immagini seguente:

    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);
    }

    speranza che aiuta!

    • Che è deliziosamente hackalicious.
    • questo hack funzionano ancora o è stato bloccato da un Adobe fix?
    • Questo non funziona più. E ‘ stato patchato da Adobe alcune versioni fa…
  3. 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);

    Forse si può provare ad aggiungere loadercontext ad esso.

Lascia un commento