Flash AS3 получает нарушение безопасной среды при попытке извлечения внешнего swf-файла

#flash #actionscript-3 #security #flash-cs5 #sandbox

#flash #actionscript-3 #Безопасность #flash-cs5 #изолированная среда

Вопрос:

Hii, я пытаюсь загрузить swf-файл в свое flash-приложение с другого сервера. Когда я пытаюсь загрузить его во flash IDE (crl enter), все работает нормально, но когда я запускаю swf-файл как независимый swf-файл или при его отладке, я получаю эту ошибку:

 SecurityError: Error #2121: Security sandbox violation: LoaderInfo.content: file:///C|/Users/something/Desktop/blablabla/myplayer.swf cannot access http://www.somedomain.com/blablabla/lalalala/abc.swf. This may be worked around by calling Security.allowDomain.
at flash.display::LoaderInfo/get content()
at wallplayer_fla::MainTimeline/swfLoaded()[wallplayer_fla.MainTimeline::frame1:216]
Cannot display source code at this location.
  

У меня есть crossdomain.xml файл в корне моего сервера:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy>
  

В «myplayer.swf» у меня есть:

 Security.allowDomain("*");
Security.allowInsecureDomain("*");
...
...
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
loaderContext.allowCodeImport = true;

ldr = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoaded);
ldr.load(new URLRequest(graySwfFilename), loaderContext);
...
...
var mcExt;
var ldr:Loader;
function swfLoaded(e:Event):void {
    mcExt = MovieClip(ldr.contentLoaderInfo.content);
    ldr.contentLoaderInfo.removeEventListener(Event.COMPLETE, swfLoaded);
    mcExt.x = 0;
    mcExt.y = 0;
    addChild(mcExt);
}
  

Я действительно не знаю, что делать…
Пожалуйста, помогите?

Ответ №1:

Решение: для Flex 4.x (в настоящее время 4.6) и AS3 во Flash Builder:

     import flash.system.SecurityDomain;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    var loaderContext:LoaderContext = new LoaderContext();
    loaderContext.applicationDomain = ApplicationDomain.currentDomain;
    loaderContext.securityDomain = SecurityDomain.currentDomain; // Sets the security 
  

контекст для устранения ошибки # 2121

… теперь загрузите свой SWF с

 loader.load(new URLRequest(webServerWebURL),loaderContext);
  

Ответ №2:

Добавьте свою рабочую папку на панель глобальных настроек безопасности. Это позволяет загружать внешние файлы из одного SWF-файла в вашей файловой системе. То же самое, если вы хотите, чтобы файл.swf загружал b.swf, даже если они расположены в одной папке.

Это позволит вашему SWF-файлу читать внешние файлы.

Однако это не должно быть проблемой, если вы загружаете свой SWF-файл на сервер.

Комментарии:

1. ВАУ! Спасибо, чувак! Но это решит проблему только на моем компьютере. Если я собираюсь загрузить этот проигрыватель на какой-либо сайт через Интернет, это не исправит проблему … не так ли?

2. Могу ли я достичь тех же результатов при внедрении myplayer.swf на веб-сайте?

3. @hdmi3killer swf-файлы имеют локальные или глобальные ограничения на загрузку. После установки на сервер эти ограничения не влияют на загрузку

4. решение, которое вы мне дали, успешно, когда я запускаю его на своем компьютере в точно указанной папке, но когда я попытался запустить его как встроенный facebook (когда он на моем сервере), ему не удается получить abc.swf. У вас есть какие-нибудь идеи?

5. ХОРОШО .. я понял это! Мне просто нужно было поместить allowDomain в загруженный swf-файл вместо загружаемого swf-файла!!!

Ответ №3:

Ваша ошибка связана с внешним расположением, в котором нет междоменного файла, а не с вами. Ознакомьтесь с этим руководством по использованию файла bridge для связи с внешним API. В этом примере я использовал as3 и php. Хитрость заключается в сохранении контроля над междоменным файлом в вашем домене.Затем позвольте вашему серверу взаимодействовать с api.