Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.07.2010, 20:42
vo1d вне форума Посмотреть профиль Отправить личное сообщение для vo1d Найти все сообщения от vo1d
  № 1  
Ответить с цитированием
vo1d

Регистрация: Jul 2010
Сообщений: 2
По умолчанию Security issue: вызов javascript-функции через ExternalInterface

Всем привет,
сразу оговорюсь: я не Flash-разработчик, просто столкнулся с проблемой при написании крохотного приложения для тестирования страницы, содержащей Flash-объект. Решения никакого выгуглить не удалось...

Итак, что надо:
1) С домена domainA загружается страница, которая внутри себя содержит 2 javascript-функции: getDataAsJSON(id) и updateResponse(id, value) - первая служит для получения некоторых данных со страницы Flash-приложением, вторая - для установки им некоторых результирующих значений.
2) На странице размещён object-тэг, загружающий Flash-приложение с другого домена, domainB. Вот HTML, в который он рендерится для IE 8:
Код:
  <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="flash_q17" name="flash_q17" width="400" height="300">
        <param name="movie" value="http://domainB/Test.swf" />
        <param name="allowScriptAccess" value="always"/>
        <param name="allowNetworking" value="all"/>
        <param name="swliveconnect" value="true"/>
        <param name="allowFullscreen" value="false"/>
        <param name="play" value="true">
        <param name="menu" value="false"/>
        <param name="quality" value="high"/>
        <param name="flashvars" value="questionKey=q17"/>
        <a href="http://www.adobe.com/go/getflashplayer">
            <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
        </a>
    </object>
3) Flash-приложение содержит простейший ActionScript, загружающий данные, полученные от первой функции, в TextInput, и вызывающий вторую функцию с некоторыми аргументами. Кода под рукой нет, но что-то типа такого:

Код AS3:
tbxInput.text = ExternalInterface.call("getDataAsJSON", "abcdefg").toString();
ExternalInterface.call("updateResponse", "abcdefg", "123456");
Итак, результаты таковы:
a) когда domainA == domainB, всё великолепно работает (локально и удалённо)
б) когда domainA != domainB, но оба хостятся физически на одном сервере (в одной файловой системе, например myserver/domainA и myserver/domainB), то при вызове из локального браузера (т.е. когда для мена myserver == localhost) всё работает; при удалённом вызове - нет (tbxInput пустой, "updateResonse" тоже не вызывается, никаких видимых ошибок в браузер не выводится - просто приложение загружается пустым и нерабочим).
в) если я в Global Security Settings Panel разрешаю всё обоих доменов, всё снова работает (точно вкладку не скажу, кажется, вот эта имела решающее значение: http://www.macromedia.com/support/do...manager04.html)

Проблема в том, что не могу же я конечному пользователю предлагать идти по какой-то там ссылке и настраивать права доступа для каждого Flash-приложения. В реальной production-системе они будут просто загружаться по внешним ссылкам, т.е. я никакого участия в их разработке принимать не буду, моя задача - отрендерить для них валидный контейнер, а также пропихнуть внутрь приложения инициализирующий данные и получить на выходе некоторый value. Если с первой задачей я, допустим, могу справиться, сериализовав все входные данные в строку и запихнув её во flashVars (что в принципе уже не слишком хорошо), то со второй задачей так не поступить, поскольку value должен вернуться в js текущей страницы для дальнейшего использования. В общем, мне надо как-то обойти эти нелепые ограничения безопасности.

Придумал пока разве что разместить в domainA HTTP-хэндлер, который внутри себя будет загружать приложение и отдавать его в респонс (короче, прокси). Но это же бред - такую тривиальную, вроде бы, задачу, таким образом решать...

Буду благодарен любым подсказкам/комментариям.


Последний раз редактировалось wvxvw; 28.07.2010 в 22:06.
Старый 28.07.2010, 21:23
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 2  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Подсказка:
flash.system.Security.allowDomain("мой домен")

Комментарий:
Таким образом Вы разрешаете внешним объектам с указанных доменов обращаться к Вашей swf-ке
__________________
...вселенская грусть

Старый 28.07.2010, 22:06
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
vo1d: Код нужно оформлять тегами [code][/code].
__________________
Hell is the possibility of sanity

Старый 28.07.2010, 22:28
vo1d вне форума Посмотреть профиль Отправить личное сообщение для vo1d Найти все сообщения от vo1d
  № 4  
Ответить с цитированием
vo1d

Регистрация: Jul 2010
Сообщений: 2
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Подсказка:
flash.system.Security.allowDomain("мой домен")

Комментарий:
Таким образом Вы разрешаете внешним объектам с указанных доменов обращаться к Вашей swf-ке
Насколько я понимаю, мне не внешним объектам надо разрешить доступ к swf-ке, а наоборот, позволить swf-ке вызывать javascript-функции со страницы (загруженной из другого домена, нежели swf-файл).

В любом случае, пробовал Security.allowDomain("*") - не помогло.

Добавлено через 1 час 15 минут
Блин, вообще мистика какая-то... 10 раз подряд загрузил страницу, содержащую Flash-объект - в трёх случаях загрузилась нормальная рабочая флэшка, вызывающая js-код, а в остальных - "пустышка". Может, я созданием флэшки где-то накосячил? Это ничего, что я код положил просто в первый фрейм единственного слоя?


Последний раз редактировалось vo1d; 28.07.2010 в 22:31.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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