Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка безопасности при загрузке из вторичной swf (http://www.flasher.ru/forum/showthread.php?t=175760)

s3dworld 23.02.2012 17:55

Ошибка безопасности при загрузке из вторичной swf
 
Всем доброго вечера!

Уже второй день не могу решить свою проблему. Есть Loader.swf и есть Game.swf. Пишу игру под социальную сеть ВКонтакте. На ВКонтактовский сервер заливаю Loader.swf, а на наш сервер - Game.swf. Для того чтобы каждый раз не бегать ВКонтакт, я решил локально запускать игру и связываться с их API. Вот в чём суть. Я успешно получаю список друзей, у которых установлена игра. Так же успешно получаю информацию о пользователях по полученным UIN'ам. Запоминаю из этой информации поле с адресом картинки. Далее я гружу эти картинки и вывожу их. Всё это успешно работает, если я запускаю с локального компьютера Game.swf (собственно именно в нём весь этот код). Стоит же мне запустить Loader.swf (а она в свою очередь грузит Game.swf и добавляет его в свой список отображения) локально или из ВКонтакта (из ВКонтакта вообще не выскакивает сообщений, просто не выводится и всё), то появляются ошибки. Вот что мне пишут:

Цитата:

SecurityError: Error #2122: Нарушение изолированной среды: Loader.content: http://????/Game.swf?1330004762315 не может осуществить доступ к http://cs5504.vkontakte.ru/????/????.jpg. Необходим файл политики, но, когда были загружены эти мультимедийные данные, флаг checkPolicyFile не был установлен.
at flash.display::Loader/get content()
Тогда я решил поставить этот флаг:

Цитата:

*** Нарушение безопасности изолированной среды ***
Подключение к http://cs5504.vkontakte.ru/????/????.jpg прервано – нет разрешения от http://????/Game.swf?1330005003350

SecurityError: Error #2123: Нарушение изолированной среды: Loader.content: http://????/Game.swf?1330004975044 не может осуществить доступ к http://cs5504.vkontakte.ru/????/????.jpg. Не предоставлен доступ к файлам политики.
at flash.display::Loader/get content()
Я уже и пробовал грузить Game.swf разными способами:

Код AS3:

loader.load(new URLRequest(url),new LoaderContext(true,ApplicationDomain.currentDomain,SecurityDomain.currentDomain));

И так:

Код AS3:

loader.load(new URLRequest(url),new LoaderContext(true));

И вот так:

Код AS3:

loader.load(new URLRequest(url));

Ничего не помогает. Помогите, пожалуйста! Сам уже ничего не понимаю. У меня нет вариантов. Первая swf может грузить, а дочерняя нет. Что мне надо прописать чтобы заработало?

GBee 23.02.2012 18:01

Хак вы не захотели использовать?

Добавлено через 2 минуты
Цитата:

*** Нарушение безопасности изолированной среды ***
Подключение к http://cs5504.vkontakte.ru/????/????.jpg прервано – нет разрешения от http://????/Game.swf?1330005003350
http://help.adobe.com/ru_RU/FlashPla...#allowDomain()

?

s3dworld 23.02.2012 18:11

GBee
Цитата:

Хак вы не захотели использовать?
Не, не хочется.

У меня в конструкторах обоих swf уже прописано:

Код AS3:

Security.allowDomain("*");
var localConnection:LocalConnection=new LocalConnection();
localConnection.allowDomain("*");


maxkar 23.02.2012 18:44

Цитата:

*** Нарушение безопасности изолированной среды ***
Подключение к http://cs5504.vkontakte.ru/????/????.jpg прервано – нет разрешения от http://????/Game.swf?1330005003350
allow-networking стоит при публикации (компиляции) Game.swf?

s3dworld 23.02.2012 18:51

maxkar
Цитата:

allow-networking стоит при публикации (компиляции) Game.swf?
Это вот этот?

http://xmages.net/storage/10/1/0/a/3...d/ed900a92.png

В обоих swf стояло "Доступ только к локальным файлам". Game.swf скомпилировал с другим параметром, но всё осталось по прежнему. Неужели никто не поможет?

maxkar 23.02.2012 18:54

Да, оно. В обеих поставьте "доступ только к сети". Так как Game.swf вы грузите в домен безопасности Loader.swf, там могут использоваться и его (loader'а) настройки.

s3dworld 23.02.2012 19:02

maxkar
Цитата:

Да, оно. В обеих поставьте "доступ только к сети". Так как Game.swf вы грузите в домен безопасности Loader.swf, там могут использоваться и его (loader'а) настройки.
Не помогло. Всё так же. (((((

maxkar 23.02.2012 19:12

А сейчас какой вариант сделан и какая ошибка? Интересует загрузка Game.swf в ApplicationDomain.currentDomain + SecurityDomain.currentDomain, для картинок - checkPolicyFile в true и для обоих файлов "доступ только к сети".

Ошибок было изначально три (2122, 2123 и невозомжность соединения), что осталось сейчас?

s3dworld 23.02.2012 19:26

maxkar
Сейчас всё подробно опишу.

Для Loader.swf поставил "Доступ только к сети". Загружаю swf следующим кодом:

Код AS3:

gameLoader.load(
    new URLRequest("http://????/Game.swf?"+(new Date()).getTime().toString()),
    new LoaderContext(true,ApplicationDomain.currentDomain));

Для Game.swf поставил "Доступ только к сети". Загружаю картинки следующим кодом:

Код AS3:

loader.load(new URLRequest(url),new LoaderContext(true));

При этом выводит:

Цитата:

*** Нарушение безопасности изолированной среды ***
Подключение к http://cs9315.vkontakte.ru/????/????.jpg прервано – нет разрешения от http://????/Game.swf?1330010554854

*** Нарушение безопасности изолированной среды ***
Подключение к http://cs5504.vkontakte.ru/????/????.jpg прервано – нет разрешения от http://????/Game.swf?1330010554854
SecurityError: Error #2123: Нарушение изолированной среды: Loader.content: http://????/Game.swf?1330010554854 не может осуществить доступ к http://cs5504.vkontakte.ru/????/????.jpg. Не предоставлен доступ к файлам политики.
at flash.display::Loader/get content()
at d.game.loading::UsersLoad/GetData()
at d.game.gui.mainBottom::GUIMainBottom/ResetFriends()
at d.game.gui.mainBottom::GUIMainBottom()
at d.game.manager::GUIManager()
at d.game::Game/OnFirstLoadSuccess()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at d.game.loading::FirstLoad/OnMapPreparationSuccess()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at d.game.manager::MapManager/OnAllObjectsLoadSuccess()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at d.game.loading::MapLoad/OnObjectLoadSuccess()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at d.game.loading::ObjectLoad/OnComplete()
А запустить с:

Код AS3:

gameLoader.load(
    new URLRequest("http://eqtst.anybrothers.com/gamenew/i/Game.swf?"+(new Date()).getTime().toString()),
    new LoaderContext(true,ApplicationDomain.currentDomain,SecurityDomain.currentDomain));

Я не могу. Ругается:

Цитата:

SecurityError: Error #2142: Нарушение изолированной среды: локальные SWF-файлы не могут использовать свойство LoaderContext.securityDomain. file:///????/Loader.swf пытался загрузить http://????/Game.swf?1330010714546.
at flash.display::Loader/_load()
at flash.display::Loader/load()
at d::Main/gameLoad()
at d::Main/onAddedToStage()
Я пока вообще ничего не понимаю.

MikroAcse 23.02.2012 19:54

Цитата:

локальные SWF-файлы не могут использовать свойство
Перечитай предыдущую строчку.

maxkar 23.02.2012 20:11

Лоадер должен быть на серверах контакта. И game.swf должен грузиться в домены (App и Security) Loader'а. Только тогда все будет хорошо. Во всех остальных случаях исходный домен будет не тот. Если хочется запускать локально - используйте хак.

s3dworld 23.02.2012 20:25

maxkar
Цитата:

Лоадер должен быть на серверах контакта. И game.swf должен грузиться в домены (App и Security) Loader'а. Только тогда все будет хорошо.
Хорошо! Всё тоже самое. Ничего не меняю. То есть вот так в Loader.swf:

Код AS3:

gameLoader.load(
    new URLRequest("http://????/Game.swf?"+(new Date()).getTime().toString()),
    new LoaderContext(true,ApplicationDomain.currentDomain,SecurityDomain.currentDomain));

Гружу его ВКонтакт. Запускаю и где-то ошибка, так как Flash'ка повисла.

maxkar 23.02.2012 21:21

А какая ошибка то??? "Работает"/"не работает" - это плохая диагностика. Она даже не говорит, на каком шаге произошла ошибка.

Можно дебагером подключиться и посмотреть, что происходит. Можно на нужные события подписаться и куда-нибудь на сцену вывести текст/картинку/объект в зависимости от типа ошибки. У вас плеер дебажный в браузере или обычный?

Да и вообще "подвисать" неправильно! Может, у пользователя в момент загрузки картинок проблемы с сетью возникли. Или у контакта. Ваше приложение так и будет висеть или какое-нибудь вразумительное сообщение выведет?

carrotoff 23.02.2012 21:33

Цитата:

Гружу его ВКонтакт. Запускаю и где-то ошибка, так как Flash'ка повисла.
Посмотрите дебагером, какая ошибка.

s3dworld 23.02.2012 21:42

Ребят, тогда подскажите как на Google Chrome поставить Flash Player для отладки. Захожу на сайт Adobe, а мне пишут что у меня уже стоит проигрыватель. А как его удалить, я не нашёл.

maxkar 23.02.2012 22:10

Плеер нужно взять здесь. Вам нужен plugin content debugger.

После этого можно попробовать переключить плеер, описано здесь. Удалить плеер из хрома может оказатсья сложно (проще выключить встроенную версию).

Ну или можно поставить другой бразуер (это может оказаться проще, чем настраивать хром).

s3dworld 23.02.2012 22:23

maxkar
Так и сделал. Поставил Debug на IE (стыдно, но что же делать). В общем вот что мне он выдал:

Цитата:

SecurityError: Error #2121: Нарушение изолированной среды: Loader.content: http://cs303315.vk.com/[[IMPORT]]/????/Game.swf?1330021208255 не может осуществить доступ к http://????/bonfire.swf. Этого можно избежать посредством вызова Security.allowDomain.
at flash.display::Loader/get content()
at d.game.loading::MapLoad/GetData()
at d.game.render::RenderMap/Draw()
at d.game.manager::MapManager/OnAllObjectsLoadSuccess()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at d.game.loading::MapLoad/OnObjectLoadSuccess()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at d.game.loading::ObjectLoad/OnComplete()

maxkar 23.02.2012 22:37

Вот. Уже гораздо лучше. До контакта дело не доходит (и там то, скорее всего, уже все нормально). В какие Application/Security домены грузится bonfier.swf? Вероятно, в bonfire.swf нужно прописать Security.allowDomain("*"). Иначе доступа к конетнту не будет. Или грузить bonfire.swf тоже в SecurityDomain.currentDomain (application domain может быть другой). Последнее для доступа к классам точно работает (без прописывания allowDomain), для Loader.content - не знаю.

Добавлено через 15 минут
Есть еще один вариант. Но он может оказаться менее красивым и сложнее в реализации.

Загрузку картинок из контакта можно сделать в Loader.swf. Game.swf в этом случае загружается в свой applicationDomain/securityDomain, разрешает всем доступ (allowDomain("*")). Для загрузки аватарок обращается к Loader.swf (доступ разрешен), та в свою очередь загружает картинку и извлекает из нее bitmapData (так как она на серверах контакта, но loadPolicyFile все равно должен быть установлен) и передает уже извлеченную bitmapData в Game.swf. Не нравится мне то, что сетевые сервисы (с кодом обработки ошибок и т.п.) могут оказаться размазаны по Game.swf и Loader.swf

dimarik 24.02.2012 09:54

http://www.flasher.ru/forum/blog.php?b=332
http://www.flasher.ru/forum/blog.php?b=209

s3dworld 29.02.2012 18:08

Всем доброго дня!

Запустил игру из контакта (на этот раз без Loader'а, а сразу Game.swf). Вот что мне выдаёт отладочный Flash Player в браузере Internet Explorer:

Цитата:

SecurityError: Error #2121: Нарушение изолированной среды: Loader.content: http://cs5436.vk.com/????/????.zip не может осуществить доступ к http://????/bonfire.swf. Этого можно избежать посредством вызова Security.allowDomain.
Это не swf с игрой, это просто объект на карте, который представляет из себя анимацию, поэтому он и засунут в swf. Не помню есть ли в нём скрипт внутри (хотя скорее всего есть в последнем кадре скрипт возврата на первый кадр чтобы по кругу воспроизводилась анимация). В общем что за Security.allowDomain мне надо сделать и что самое главное, где?

Самое интересное, что у меня на локальном компе это всё работает. Кидаю другому на комп и у него
то не работает. Закидываю в контакт и там тоже не работает.

GBee 29.02.2012 18:13

bоnfire.swf должен Security.allowDomain, чтобы загружающие его флэшки, могли его трогать внутри. Видимо бонфаер не так прост.

s3dworld 29.02.2012 18:20

GBee
Цитата:

bоnfire.swf должен Security.allowDomain, чтобы загружающие его флэшки, могли его трогать внутри. Видимо бонфаер не так прост.
Вообще bоnfire.swf это дело рук художника/аниматора и он понятия не имеет про какую-то безопасность (как и я, кстати). Он просто накидал туда png-картинок и поставил на последний кадр примитивное gotoAndPlay(1). Там нет никаких связанных классов и прочего.

Я вообще новый программист в коллективе (и собственно единственный Flash-программист тут). Взялся за проект после предыдущего программиста. Кое какие косяки подправил и начальство решило что проект нужно с нуля переделать, так как то что там было намудрено уже никого не устраивало. И вот получается что все ресурсы (png и swf) сохранились. Я лишь пишу Game.swf. Но раньше всё это как-то грузилось и работало. А вот в моём варианте одни ошибки по безопасности.

Что можно сделать, чтобы каждый игровой swf-файл не перекомпилировать со связанным классом? Может просто все объекты грузить как набор байтов (ByteArray) и потом преобразовывать либо в Bitmap, либо в MovieClip?

dimarik 29.02.2012 22:15

Мои советы не осилили?

s3dworld 01.03.2012 12:34

dimarik
Цитата:

Мои советы не осилили?
Просто не очень хочется использовать хак. Что на счёт ByteArray?

ChuwY 01.03.2012 13:18

У вас работает больше, чем у друга, потому что приложение, скорее всего, находится в доверенном каталоге.

dimarik 02.03.2012 11:06

Какой хак? Вы что, местных специалистов по FP-безопасности наслушались? Никогда это не было хаком!

И опять эти "Доступ только к локальным файлам", "доступ только к сети". Это относится только к локальной песочнице. Зазубрите это как Отче наш! Есть четыре типа песочниц.
- local-with-networking этот ваш "доступ только к сети";
- local-with-filesystem — "Доступ только к локальным файлам";
- local-trusted — режим беспредела. Включается красной кнопкой, местоположение которой уже известно комраду ChuwY;
- remote.

Первые три вида песочниц внезапно наступают при запуске файла локально с файловой системы. Вот ведь новость!

Но это же не ваш случай! Ваше все в "remote". Пофиг с каким флагом скомпилена флешка, вы загрузили ее с удаленного хоста (даже если со своего локально установленного денвера или IIS).

Выяснили, аха.
Что происходит? Домен vkontakte.ru (Loader.swf) хочет загрузить домен mysite.ru (Game.swf). FP выделяет ему свой собственный SecurityDomain, копируя, заметьте, все свои внутренние классы, включая Object. Все, приехали. Теперь этим доменам ну никак нельзя общаться, пока каждый не разрешит доступ к
а) своему тельцу через Security.allowDomain("домен другого тельца"). LocalConnection.allowDomain("домен другого тельца"). Это "разрешение разработчика".
б) к контенту домена через crossdomain.xml. Это "разрешение распространителя".

Есть четыре способа загрузки классов в ApplicationDomain, но я вам их не скажу, не потому что я злой, а я немного злой, а потому что сейчас это пока не важно. Так вот, один из способов называется "импортирующей загрузкой", бро! Заметьте, это не хак, не шмак и не фигак. Это вам не фуфло какое-нибудь, которое гонят из под полы. Это импортирующая загрузка. Она импортирует... импортирует... импортирует один SecurityDoman в другой!

Итак, импортируем mysite.ru во vkontakte.ru. Вуаля! Game.swf уже во vkontakte.ru (теперь банановый!).
Аха, но у Game.swf теперь начались проблемки с доступом к mysite.ru. Ведь ваши дизайнеры (bоnfire.swf) не знакомы с гениальной архитектурой XII века, тьху, с политикой безопасности FP и не прописали в bоnfire.swf Security.allowDomain("домен врага"). Вы не поверите, но теперь весь контент из mysite.ru необходимо импортировать во vkontakte.ru.

Если с пониманием "разрешения разработчика" и доступом к SecurityDomain нет никаких проблем, то с доступом к контенту есть нюансы. Чтобы FP начал шевелить задницей и стал загружать контент из вражеского и только вражеского домена, ему необходимо разрешение распространителя. Этот документ оформляется в виде файла crossdomain.xml с перечнем доменов из которых разрешен доступ к сокровенному. Есть у вас на сервере crossdomain.xml с <allow-access-from domain="vkontakte.ru" />? Как прекрасно! Тогда очень скоро насладимся вашей нетленкой.

Да, все это касалось контента как swf. С картинками немного проще, если вы не собираетесь работать с их пикселями. checkPolicyFile в этом случае не нужно указывать. Loader загрузит изображение без запроса разрешения распространителя! Оп-па! Но как только ваши шаловливые ручки тронут хоть один байтик, даже хоть одну ссылочку на loader.contect этого рисуночка (к Bitmap#draw() это тоже отностися ), как тут же выскочит чертик из табакерки и поругает "Алярм! Алярм! Белые в городе! SecurityError: Error #2122: Необходим файл политики, но, когда были загружены эти мультимедийные данные, флаг checkPolicyFile не был установлен." Но мы же хорошие и указываем checkPolicyFile в таком случае. Ха! А если у нас нет возможности подкрутить crossdomain.xml, тогда читаем мой блог.

Гляньте, какой красивый http://cs5504.vkontakte.ru/crossdomain.xml. Теперь вы понимаете, что домену mysite.ru ничего не светит в плане пикселей?

Тема секурности FP сама по себе удивительна и увлекательна. Приятного вам полета.

MikroAcse 02.03.2012 11:09

Цитата:

- local-trusted — режим беспредела. Включается красной кнопкой, местоположение которой уже известно комраду ChuwY;
Я тоже хочу знать!

dimarik 02.03.2012 11:18

Так комрад любезно поделился ссылкой, если вы не заметили.


Часовой пояс GMT +4, время: 05:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.