WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 |   ...   | 5 | 6 || 8 |

«F L A S 100 советов и рекомендаций профессионала O'REILLY С&ППТЕР Шам Бхангал F L A S H H A C K S Sham Bhangal O'REILLT Beijing • Cambridge • ...»

-- [ Страница 7 ] --

Отложенная загрузка 5 секунд noflash.html Flash getURL() flash.html Рис. 11.2. Принцип работы анализатора поддержки Flash Сначала мы пытаемся выполнить Flash SWF с функцией getURLQ, которая загружает контент Flash в веб-странице flash.html. Если попытка окажется успешной, можно сделать вывод, что Flash Player установлен и нормально работает. Если же файл не выполнится, мы знаем, что поддержка Flash отсутствует в браузере. Но беспокоиться не о чем - если Flash не изменит текущую веб-страницу (то есть не загрузит flash.html методом getURL())( через пять секунд сработает отложенная загрузка, вследствие чего будет загружена HTML-страница noflash.html. Самое лучшее в данном решении - его полная независимость от JavaScript, браузера, платформы ОС или пользовательских настроек. Далее приводится более подробное описание: 1. Создайте новый документ Flash и включите следующий сценарий в кадр 1 главной временной диаграммы: getURLCflash.html". "_self"): 2. Сохраните файл под именем index.fla. 3. Опубликуйте документ командой File • Publish Preview • Default (HTML).;

Команда создает файлы index.html и index.swf в той же папке, в которой хранился файл index.fla. 4. Откройте файл index.html в текстовом редакторе по вашему выбору. 5. Секция должна выглядеть так:

charset=ISO-8859-l"> 394 < t i t l e>index Глава 11. Интеграция с браузером 6. Добавьте новый тег , выделенный далее жирным шрифтом: i ndex Создайте файл noflash.html. В нем может находиться: • версия сайта, использующая только HTML;

• HTML-страница, рекомендующая пользователю установить последнюю версию модуля Flash;

• страница с предложением щелкнуть на кнопке для перехода на сайт загрузки модулей Macromedia Flash (http://www.macromedia.com/shockwave/download/ download. bgi?P1_Prod_Version=ShockWaveFlash). В любом случае страница должна объяснять, что поддержка Flash не обнаружена. Кроме того, на ней должна размещаться ссылка для загрузки Flash-версии сайта на случай, если модуль все же установлен. Ничто так не раздражает пользователя, как сообщения об отсутствии поддержки Flash только из-за того, что процедура автоматического обнаружения сработала неправильно. Не стоит бесцеремонно отправлять пользователя на сайт Macromedia для загрузки модуля Flash - предоставьте пользователю самостоятельно выбрать курс дальнейших действий. Поместите файлы flash.html и someFlashMovie.swf (Flash-сайт) в одну папку с файлом index.html. Чтобы провести локальное тестирование анализатора, откройте index.html в браузере. Если с тестированием возникнут проблемы, обращайтесь к файлам на сайте книги. Когда схема успешно заработает, загрузите файлы на веб-сервер и введите в браузере URL загруженной HTML-страницы - например, http://www.yourdomain.com/ sniffertest/index.html. Чтобы эмулировать простейший браузер без каких-либо модулей, посетите сайт http://www.anybrowser.com с эмулятором браузера, совместимого с HTML 3.2, идеальное место для тестирования анализатора поддержки Flash.

Возможные проблемы Иногда оказывается, что ранние версии Flash Player распознают функцию getURL(), поддерживаемую с Flash Player 2, но не воспроизводят весь контент Flash-сайта. Допустим, вы хотите использовать видео, поддерживаемое Flash Player версий 6 и выше, а у пользователя установлен Flash Player 5. Flash Player 5 поддерживает метод getURLQ, но не воспроизводит видео, внедренное в SWF-файл. В подобных случаях приходится проверять минимальную версию модуля Flash Player. Flash-ролик для проверки версии Flash Player должен быть SWF-файлом Flash Player 4 или Flash Player 5. Он проверяет версию Flash Player, а затем загружает Универсальный анализатор поддержки Flash другой SWF-файл (вероятно, в формате Flash Player 6 или Flash Player 7) с настоящим контентом. Для проверки версии Flash Player используется переменная окружения Flash $version. Эта переменная присутствует на вкладке Variables панели Debugger (рис. 11.3) при тестировании ролика в отладочном режиме.

Ш _global Nsme ^version [Value Рис. 11.3. Вкладка Variables панели Debugger с информацией о версии Flash Свойство $version поддерживается в Flash Player версии 4.0.11.0 и выше. Оно возвращает строку в форме «платформа номер_версии», где платформа WIN, MAC или UNIX, а номер версии состоит из четырех чисел, разделенных запятыми, - основной и дополнительной версий, номера сборки и исправления (например, "WIN 6,0,21,0"). Не используйте более современные средства получения номера версии - такие, как функция getVersion(), поддерживаемая в Flash 5 и выше, или свойство System.capabilities.version (поддерживается в Flash б и выше), если у вас нет полной уверенности в том, что пользователь использует более новую версию модуля. Впрочем, если у пользователя установлена хоть какая-то версия Flash Player, скорее всего, это минимум версия 5, а по статистике (http://wvwv.macromedia.com/software/player_census/flashplayer/version_penetration.html) свыше 90 % пользователей использует Flash Player 6 и более поздние версии. Так или иначе, $version, getVersionQ и System.capabilities.version возвращают одну и ту же строку (если, конечно, они поддерживаются в данной платформе). Основной нрмер версии для Мае и Windows хранится в строке $version со смещением 4 (пятый символ). Мы воспользуемся методом String.substr(), чтобы проверить, установлен ли у пользователя Flash Player версии 5 и выше. Если условие выполняется, текущая страница заменяется страницей flash.html. В противном случае выводится странице с сообщением об ошибке и предложением обновить Flash Player до версии 5 и выше: i f (Sversion.substr(4.1) >= 5) { getURU "flash.html", "_self");

} else { getURK "ol d_fl ash. html". "_sel f " ) :

Глава 11. Интеграция с браузером В Flash Player версий 1, 2 и 3 произойдет сбой, и сценарий просто продолжит воспроизведение SWF, но эти версии давно устарели и представляют менее 1% пользовательской базы. Самая замечательная особенность этого трюка состоит в том, что схему обнаружения не придется модифицировать для пользователей Flash Player 6, Flash Player 7 или будущих версий. Если вы хотите поддерживать платформы, для которых в строку версии включается префикс UNIX, извлеките основной номер версии после первого пробела в строке (не предполагая, что он является пятым символом).

Итоги Трюк, представленный в настоящем разделе, проверяет отсутствие Flash Player это проще, чем активное определение наличия Flash Player. Если Flash Player присутствует в системе, мы проверяем его версию (если потребуется). Вместо проверки Flash Player из JavaScript мы просто предлагаем Flash Player идентифицировать себя. Наш анализатор не зависит ни от поддержки JavaScript, ни от версии модуля Flash Player. Минимальным требованием является поддержка тега , обеспечиваемая браузерами версий 3.x и выше. Как максимум, требуется модуль Flash Player, способный опознать команду if и свойство $version (а именно Flash Player 4 и выше). Конечно, рассмотренное решение представляет собой трюк (если на то пошло, вся книга посвящена трюкам) и не обеспечивает абсолютной надежности. В зависимости от конфигурации пользователям Internet Explorer без Flash Player может быть предложено установить соответствующий элемент ActiveX. В то же время, в зависимости от временных характеристик (от того, сколько времени уйдет на вывод сообщения и ответные действия) пользователь может не попасть на страницу без Flash. Сценарии обнаружения модулей не бывают идеальными - у любого из них найдутся свои недостатки. Рассматривайте этот прием как лишнюю стрелу в своем колчане, а не как серебряную пулю. За информацией о более традиционных методах идентификации поддержки Flash обращайтесь к ресурсам, перечисленным во введении к настоящей главе.

Тестирование с разными версиями №88 Flash ТРЮК Тестирование приложений с разными версиями Flash Player без перехода на другой компьютер или ручной установки/удаления других версий. Многие клиенты требуют, чтобы их сайт оставался совместимым с предыдущей версией Flash Player (на момент написания книги - Flash Player 6) до тех пор, пока текущая версия (Flash Player 7) не достигнет пользовательской базы примерно в 90%. Столь широкое распространение обычно достигается через 18 месяцев после выхода новой версии.

Тестирование с разными версиями Flash Среда разработки Flash позволяет создавать контент, рассчитанный на предыдущие версии Flash Player, однако в ней не предусмотрены средства тестирования SWF в предыдущих версиях - по умолчанию предполагается, что контент будет просматриваться в последней версии Player (сейчас это Flash 7). К счастью, Macromedia следит за тем, чтобы старые SWF-файлы воспроизводились новыми версиями Flash Player так же хорошо, как в предыдущих версиях Flash Player. Хороший дизайнер тестирует свой продукт в новейшей версии Flash Player. Тем не менее, сайт также стоит протестировать в предыдущих версиях Flash Player, но такое тестирование создает немало проблем. Поскольку в любом браузере в любой момент времени может быть установлена лишь одна версия Flash Player, возможны четыре варианта: • установите нужную версию Flash Player перед тестированием и восстановите более новую версию после его завершения;

• проведите тестирование на нескольких компьютерах с разными версиями Flash Player. Во многих крупных организациях создаются специальные тестовые лаборатории, оснащенные множеством компьютеров с разными конфигурациями. Но если в вашей организации не хватает лишних компьютеров или места для их размещения, такое решение становится неприемлемым;

• попросите друзей заняться тестированием. Идея отнюдь не плохая, но, скорее всего, ваши друзья - Flash-разработчики с последней версией модуля Flash, которым вряд ли захочется отягощать себя лишней работой;

• воспользуйтесь превосходной программой Flash Plugin Switcher (http:// www.kewbee.de/FlashPluginSwitcher) Алекса Блума (Alex Blum), которая избавит вас от необходимости устанавливать или удалять модули Flash Player или элементы ActiveX. Чтобы не создавать себе лишних трудностей, в этом трюке будем использовать Flash Plugin Switcher (FPS). Логотип этой программы изображен на рис. 11.4. FPS заставляет браузер вернуться к предыдущей версии Flash Player. К сожалению, приложение работает только в системе Windows, поэтому на платформе Macintosh вам придется прибегнуть к другим способам.

FlashPfuginSwltcher Рис. 11.4. Логотип Flash Plugin Switcher На сайте Алекса используется немецкий язык, но само приложение и его справочные файлы написаны на английском. Macromedia поддерживает на своем сайте архив старых версий Flash Player (вплоть до Flash Player 2), предназначенный для тестирования: http://www.macromedia.com/support/flash/ts/documents/oldplayers.htm Глава 11. Интеграция с браузером По этому адресу размещена статья 14266 «Archived Macromedia Flash Players available for testing purposes». Если Macromedia вдруг изменит URL, просто введите номер 14266 в поисковом поле на домашней странице Macromedia. Flash Plugin Switcher Распакуйте архив Flash Plugin Switcher и запустите приложение. Кнопка Help выводит информацию об установке модулей и элементов ActiveX. В окне приложения (рис. 11.5) выполняются следующие действия: 1) смена браузерного модуля или элемента ActiveX (поддерживаются Netscape и Internet Explorer);

2) смена версии Standalone Flash Player;

3) смена модуля, используемого режимом Test Movie в IDE для всех версий среды разработки Flash.

Рис. 11.5. Настройка конфигурации Flash Plugin Switcher Общая процедура смены модуля или элемента ActiveX выглядит так: 1) убедитесь в том, что браузер, Standalone Player или среда разработки (IDE) Flash, для которых вы хотите сменить модуль или элемент ActiveX, закрыт;

2) перейдите на соответствующую вкладку FPS (Browser, Standalone или Flash IDE);

3) удалите существующий экземпляр Flash Player, если соответствующая возможность присутствует на вкладке;

4) выделите и установите новый Flash Player. Просто, как все гениальное;

Настройка конфигурации по умолчанию 5) чтобы протестировать ситуацию с отсутствием модуля Flash Player, удалите текущий модуль или элемент ActiveX на вкладке Browser (см. шаг 3), но не устанавливайте другую версию.

Итоги Помните, что программа Flash Plugin Switcher существует на пожертвования пользователей. Если вы будете работать с ней, не забудьте поблагодарить Алекса через систему PayPal.

ТРЮК № Настройка конфигурации по умолчанию Изменение настроек Flash IDE по умолчанию в соответствии с текущей конфигурацией оборудования и/или особенностями рабочего процесса.

Некоторые параметры Flash по умолчанию не изменялись с первых дней существования пакета, хотя современное оборудование обычно обладает достаточным объемом памяти и/или производительностью, чтобы эти параметры можно было увеличить. Кроме того, многие пользователи не знают о важных флажках и запросчиках, спрятанных в интерфейсе Flash.

Изменение параметров по умолчанию Выполните команду Edit • Preferences и введите новые параметры по умолчанию в диалоговом окне Preferences. Рассмотрим важнейшие параметры, находящиеся на разных вкладках: • General. Для начала стоит обратить внимание на размер кэша отмены (рис. 11.6). В Flash MX 2004 его размер равен 1000 уровням, тогда как в Flash MX кэш ограничивается всего 100 уровнями. Если у вас свободная память (а у кого ее нет в наше время?), увеличьте размер кэша до 100. Editing. Хотя обновление Flash MX 2003 (http://www.macromedia.com/support/ documentation/en/flash/mx2004/releasenotes.html#Update), выпущенное в ноябре 2003 года и обновляющее среду разработки до версии 7.0.1, решает многие проблемы исходной версии 7.0, у него есть свои недостатки. В частности, некоторые поля группы Drawing Settings остаются пустыми (не содержат значения по умолчанию), что мешает нормальной работе режимов Smooth, Straighten и Ink инструмента Pen. Если вы столкнетесь с этим явлением, задайте пустым параметрам значение Normal. В конце лета 2004 года по приведенному ранее URL должно появиться обновление до версии 7.2. Clipboard. Максимальный объем буфера составляет всего 250 Кбайт, чего явно недостаточно для копирования растров из Photoshop и других графических редакторов в Flash. Если вы часто редактируете растровые изображения в Photoshop и импортируете их в Flash, увеличьте буфер до 5000 Кбайт (то есть 5 Мбайт). В этом случае вместо сохранения графики в Photoshop с последующим импортированием командой File • Import вы можете выполнить • • Глава 11. Интеграция с браузером операции копирования/вставки клавишами Ctrl+C и Ctr!+V (Windows) или SHJ+C и S€+V (Mac). При занесении вставленных растров в библиотеку Flash присваивает им имена вида «Bitmap n».

Gnr! e ea ?• General- > —•• U d levels: j W%k \ no !

••>• • Printing options: f3 Ds be PostScript ia l Selection options: Щ Shift «feet |3 Show tooltips Panel options: 3 Disable panel docking I TimeSne options: H Disable timeline docking E ] Span based selection If) Named anchor on Scene Highlight color: Ф Use this color © Use layer color I Font mapping default: jsans On launch: 0 show Start Page j | :. © New document © Last documents open j§s В Cancel Рис.

11.6. Вкладка General диалогового окна Preferences • Warnings. На вкладке Warnings ничего менять не требуется. Все предупреждения лучше оставить включенными. • ActionScript. В Flash MX 2004 и Flash MX Professional 2004 шрифт, используемый для отображения ActionScript, выбирается в раскрывающемся списке группы Text вкладки ActionScript. Ранние версии Flash такого выбора не давали - в них использовался стандартный шрифт Lucinda Console. Впрочем, шрифт Lucinda Console идеально подходит для вывода программного кода благодаря четкости и хорошим пропорциям, поэтому его стоит выбрать из раскрывающегося списка шрифтов.

Изменение параметров публикации В отличие от параметров окна Preferences, относящихся к среде разработки в целом, параметры публикации задаются (и сохраняются) отдельно для каждого Настройка конфигурации по умолчанию редактируемого документа FLA. Команда File • Publish Settings вызывает диалоговое окно Publishing Settings, в котором чаще всего используются вкладки HTML и Flash: • HTML. Среда разработки Flash генерирует HTML-страницу, в которую внедряется SWF-файл. Вкладка HTML управляет параметрами создания этой страницы (Flash MX 2004 и Flash MX Professional 2004 генерируют код XHTML, но файлу все равно присваивается расширение.html). Параметры вкладки HTML позволяют создать немасштабируемый ролик SWF, выровненный по центру окна браузера (см. трюк 90). • Rash на этой вкладке выбирается версия компилятора ActionScript -ActionScript 1.0 или ActionScript 2.0. Компилятор ActionScript 2.0 обеспечивает жесткую типизацию, учитывает регистр на стадии компиляции и поддерживает новый синтаксис ООП (например, ключевое слово class). Также здесь можно выбрать формат экспортирования SWF - Flash Player 6 или Flash Player 7 (рис. 11.7). Version: [Flash Player 7 L a order: [Bottom up od ActionScrpt version: j~ArttonScrtpt 1Рис. 11.7. Выбор версии компилятора и формата экспортирования на вкладке Flash Если в списке Version выбирается строка Flash Player 6, флажок Optimize for Flash Player 6r65. Flash Player 6r65 имеет много общего с Flash Player 7, поэтому этот выбор повышает совместимость до повсеместного распространения Flash Player 7. Учтите, что Flash Player 6r65 поддерживает не все новые возможности ActionScript, включенные в Flash Player 7 (см. главу 10). Дополнительная информация о совместимости компонентов v2 с последними версиями Flash Player приведена в блоге BIT-101 (http://www.bot-101.com/blog/archives/000047.html).

Другие панели и вкладки Панель Output приносит пользу при отладке сценариев, но она всегда открывается с теми размерами и позицией, с которыми она в последний раз открывалась в Flash. При первом входе в режим Test Movie после запуска среды разработки Flash панель Output обычно закрывает сцену тестируемого SWF-ролика. Чтобы этого не происходило, панель Output можно закрепить в правой части окна (только в Windows). В дальнейшем, когда панель Output будет активизироваться вызовами trace() в сценариях, она будет находиться справа от сцены, а не над ней. В Flash для Mac OS закрепляемые панели не поддерживаются. В интерфейсе Flash MX 2004 появились новые вкладки в верхней части окна среды разработки (в стиле Dreamweaver). Эти вкладки не только позволяют легко переключаться между открытыми окнами, но и открывают доступ к весьма удобному контекстному меню. Щелкните на вкладке правой кнопки мыши (Windows) или щелкните с нажатой кнопкой <> (Мае) - на экране появляется контекстное меню Н для открытия новых файлов или сохранения файла, связанного с вкладкой.

402 ТРЮК Глава 11. Интеграция с браузером Выравнивание SWF по центру №90 без изменения масштаба Выравнивание немасштабированного контента в окне браузера без применения таблиц или CSS. Всем известно, что векторная графика (в отличие от растровой) не теряет качества при масштабировании, но почти на всех коммерческих Flash-сайтах используются относительно небольшие, немасштабированные SWF-ролики, выровненные по центру браузера. Это объясняется следующими причинами: • Быстродействие Flash зависит от количества пикселов, изменяющихся с каждым кадром. Умеренные размеры области вывода SWF и отказ от масштабирования обеспечивают быструю работу сайта с более или менее постоянной частотой смены кадров. Ролики не рекомендуется масштабировать на весь экран (особенно до размеров 1280 х 1024 и выше), потому что при таких больших размерах области вывода Flash будет работать слишком медленно.

• На многих коммерческих Flash-сайтах используются растровые изображения, которые плохо выглядят после масштабирования. • Следует избегать масштабирования видео, поскольку это приводит к появлению артефактов оптимизации и снижению быстродействия (иногда очень серьезному), хотя применение кодека Sorenson в значительной мере решает эту проблему.

• Уменьшение размера сцены уменьшает объем графических данных, а это, в свою очередь, уменьшает нагрузку на канал связи. Слушатель Stage.onResize() даже позволяет перехватывать события изменения размеров и выполнять нестандартное масштабирование или позиционирование отдельных элементов без применения единых правил масштабирования «на все случаи жизни». Начинающие пользователи Flash часто задают один и тот же вопрос: «Как построить немасштабируемый SWF-ролик, который всегда выводится в центре окна браузера?» Ни один из готовых шаблонов, вызываемых командой File • New • Templates, не предоставляет такой возможности. Даже некоторые опытные пользователи применяют таблицы HTML или форматирование CSS. Тем не менее, проблема решается гораздо проще. Выполните команду File • Publish Settings, выберите в списках Horizontal и Vertical из группы Flash Alignment значение Center, а в списке Scale - строку No scale (рис. 11.8). К сожалению, в этом способе возможно отображение скрытого контента, находящегося вне сцены. Проблема будет решена в следующем трюке, посвященном форматированию CSS (см. трюк 91).

Выравнивание по центру с применением CSS Current profiled Default Foi mats Flash HM \ TL Template: |Flash Only 0 Detect Flash Version Dimensions: ;

Percent Width: Height;

X | 100 | percent Щ} Display menu 0 Device font ivj Playback: ED Paused at start [3 Loop Quality: W d w Mode: io n HM alignment: TL Scale:

••:•:•••'•'• - -^:

-::/Д^Г Flash alignment:

: : ;

High Window v Default ••;

.

.

.

.

•"• :'•'•.

• •.

.

;

:

.

•:

• :

• • •.

.

No scale • • • • :

:

-.' :

| / ;

.

• • ••••:

:

:

l •torizontal Vertical.

• • •,.

.

:;

•:

• Center v!

Center.. i l l.

:••:•: [;

.;

• •;

.' :

:

*•:;

;

?:

3show w a r n i ng messages :|.Publish [ c a n c e l O K Рис, 11.8. Диалоговое окно Publish Settings Выравнивание по центру №91 с применением CSS ТРЮК Центрирование немасштабируемого SWF-ролика может привести к случайному отображению контента, находящегося вне сцены. Применение XHTML и XSS дает отличный результат без отображения скрытого контента и нарушения стандартов. Одна из самых распространенных проблем, с которыми сталкиваются неопытные дизайнеры, - выравнивание SWF-ролика по центру окна браузера (см. трюк 90). Далее описаны некоторые способы решения этой задачи и трюки, необходимые для того, чтобы заставить их работать лучше.

Глава 11. Интеграция с браузером Параметры публикации Для примера возьмем SWF-ролик, показанный на рис. 11.9.

О : V ;

..

..• _ •• Рис. 11.9. Тестовая таблица Тестовая таблица закрывает сцену, а четыре угловые фигуры (два круга с вписанными квадратами и два квадрата) находятся за пределами сцены. Светлосерая рамка тоже не входит в сцену. Если масштабировать сцену по размерам окна браузера (выполните команду File • Publish Settings • HTML, выберите в списке Dimensions значение Percent), то четыре внешние фигуры не будут видны. Однако у такого решения есть серьезный недостаток. Если пользователь запустит браузер в большом окне, то большой размер полученного SWF-файла существенно замедлит работу сайта. Если выбрать в списках Horizontal и Vertical строку Center, а в списке Scale - строку No Scale (см. рис. 11.8 из предыдущего трюка), центровка будет выполнена так, как показано на рис. 11.10. SWF-ролик выровнен по центру, но в окне также отображается контент, находящийся за пределами сцены. Иногда это не создает проблем, но многие сайты содержат скрытый контент, находящийся полностью или частично вне сцены. При создании анимаций находящийся вне сцены контент обычно скрывается для организации панорамирования и наплывов. Посмотрите на рис. 11.11. Перед вами фрагмент анимации, созданной Адамом Филипсом, с которым мы работали над некоторыми проектами Выравнивание по центру с применением CSS 40°** Рис. 11.10. Тестовая таблица, выровненная по центру без масштабирования 1 l I i Щ шI Ш • им v31 III;

| jj1 Iliili H Щ i 1 i 1 I 1H ^Ш^^^яИ HI P Рис. 1 1. 1 1. SWF с отображением контента, находящегося вне сцены Глава 11. Интеграция с браузером В принципе, SWF можно отцентровать в браузере с применением параметров Publish Settings, но у такого решения есть серьезный недостаток: контент, находящийся вне сцены, также будет видимым. Наша цель - скрыть весь контент, находящийся за пределами сцены. Как видно из рис. 11.12, на том же кадре итоговой анимации отображается только контент, находящийся на сцене. Задача решается небольшим объемом HTML-кода.

Рис. 11.12. В итоговом варианте SWF отображается только сцена Выравнивание по центру с использованием H M TL В Flash Player 6 и ранее для центровки SWF применялись таблицы HTML. Flash MX генерирует HTML-код, в котором SWF внедряется в веб-страницу тегами и . Остается лишь заключить эти два тега в простой тег с атрибутами горизонтального (align="center") и вертикального (valign="middle") выравнивания. В следующем листинге внесенные изменения выделены жирным шрифтом: \ 7 F L A S 100 советов и рекомендаций профессионала O'REILLY С&ППТЕР Шам Бхангал F L A S H H A C K S Sham Bhangal O'REILLT Beijing • Cambridge • Farnham • Kbln • Paris • Sebastopol > Taipei • Tokyo F L
Выравнивание по центру с применением CSS
Добавление тега не только выравнивает SWF по центру, но и скрывает контент, находящийся вне сцены. К сожалению, этот способ не работает в Flash MX 2004. Flash MX 2004 экспортирует код XHTML, а не HTML, а вертикальное выравнивание таблиц HTML плохо работает в XHTML. В принципе, проблема решается внедрением файлов Flash 7 в HTML, но лучше ограничиться XHTML и использовать теги
и вместо устаревших тегов
и атрибутов выравнивания.

Выравнивание по центру в Flash M 2004 X с использованием C S S Поскольку Flash MX 2004 экспортирует код XHTML, атрибут valign оказывается под запретом. Несмотря на общую поддержку таблиц, все форматирование лучше выполнять на уровне CSS. К сожалению, в CSS не существует стандартных средств для выравнивания чеголибо по вертикали - придется изобретать трюки. Если опустить подробное перечисление атрибутов тегов , и , типичный файл XHTML в Flash MX 2004 выглядит примерно так: 7 F L A S 100 советов и рекомендаций профессионала O'REILLY С&ППТЕР Шам Бхангал F L A S H H A C K S Sham Bhangal O'REILLT Beijing • Cambridge • Farnham • Kbln • Paris • Sebastopol > Taipei • Tokyo F L Чтобы выровнять Flash-контент по центру, нужно сначала вручную отредактировать XHTML и добавить определение стиля. Для быстрого редактирования XHTML-кода SWF-ролика, просматриваемого локально в IE, выполните команду View • Source. Конечно, для этого файловые ассоциации должны быть настроены на запуск простого текстового редактора типа Блокнота, а не Word! Добавьте следующее определение стиля между тегами и : Глава 11. Интеграция с браузером Теоретически это должно приводить к размещению SWF на расстоянии 50% от левого и верхнего полей браузера (а также удалению лишних промежутков вдоль краев страницы), но есть одно неожиданное обстоятельство: CSS предполагает, что точка регистрации находится в левом верхнем углу SWF. Чтобы увидеть ошибку выравнивания, заключите теги и в тег
с атрибутом centercontent, как показано в следующем листинге (дополнения выделены жирным шрифтом):
CSS выполняет центровку, но по центру выравнивается левый верхний угол S W F ( P H C. 11.13). >i1 Fie E •* Fv eeo - e *<*5 *

. Рис. 11.13. Левый верхний угол SWF выравнивается по центру окна браузера Выравнивание по центру с применением CSS В решении проблемы нам поможет одно малоизвестное обстоятельство - в CSS допускаются отрицательные размеры полей. Если сдвинуть левое и верхнее поля на величину, равную половине высоты и ширины сцены SWF, SWF тоже сместится так, что центральная точка SWF совпадет с центральной точкой окна браузера (рис. 11.14).

Рис. 11.14. Выравнивание SWF по центру с применением отрицательных полей Добавьте следующий код в определение #centercontent файла XHTML (для сцены, имеющей стандартные размеры 550 х 400 пикселов): #centercontent { margin-left:

-275px;

margin-top:

-200px;

text-align: center;

position: absolute;

top: 50Я: l e f t : Ь0%;

Атрибутам margin-left и margin-top задаются значения, равные половине ширины и высоты сцены Flash в пикселах (с отрицательным знаком). Описанный прием центрирует SWF в любом браузере, поддерживающем XHTML и CSS.

Глава 11. Интеграция с браузером Окончательный результат - выравнивание SWF по центру без масштабирования и без открытия контента, находящегося за пределами сцены, - показан на рис. 11.15.

Рис. 11.15. SWF выравнивается по центру окна без масштабирования и без открытия контента, находящегося за пределами сцены Итоги В выборе между HTML и XHTML/CSS нам, Flash-разработчикам, не пристало отдавать предпочтение старым технологиям. Наверное, правильное центрирование SWF с применением CSS неочевидно, но стоит узнать пару трюков, и вы без труда добьетесь от браузера нужного поведения.

Динамическое масштабирование №92 контента ТРЮК В идеале Flash-контент сохраняет свои размеры даже в том случае, если пользователь изменил размеры окна браузера. Динамическое масштабирование контента в ответ на изменение размеров браузера поможет сохранить исходный дизайн. Динамическое масштабирование SWF по размерам окна браузера вроде бы не должно создавать проблем, но похоже, многие разработчики не умеют правильно организовать его. Давайте разберемся, как это делается. Хотя Flash Player поддерживает масштабирование SWF по размерам окна браузера, делать этого не стоит по нескольким причинам: • слишком большое увеличение отрицательно отразится на быстродействии (особенно на больших экранах);

Динамическое масштабирование контента • при увеличении растровых изображений на Flash-сайтах сильнее проявляются недостатки графики;

• уменьшение Flash-сайта затрудняет работу с ним с точки зрения пользовательского интерфейса;

• многие части типичного Flash-сайта проектируются под конкретный размер, а их просмотр в увеличенном виде снижает общее впечатление. Например, растровые шрифты проектируются под малый размер и в увеличенном виде смотрятся довольно убого. Кроме того, некоторые шрифты без засечек и моноширинные шрифты масштабируются непропорционально. Другое, более предпочтительное решение - разрешить масштабирование отдельных частей сайта или ограничить масштабный коэффициент. Разработчик может посчитать, что масштабирование следует вообще запретить, чтобы не нарушать графический стиль сайта, но при этом возникают две проблемы. Сайт, который отлично смотрится на большом 21-дюймовом экране, может стать совершенно невразумительным на 17-дюймовом экране. И наоборот, сцена, которая хорошо воспринимается на 17-дюймовом экране, на большом экране покажется слишком мелкой. Хорошее компромиссное решение - разрешить масштабирование сайта от 10 до 20 % в обе стороны. Тем самым обеспечивается работа сайта на экранах разных размеров без нарушения общей эстетики.

Определение размеров сцены Размеры сцены определяются легко - нужная информация хранится в статических свойствах класса Stage: trace(Stage.width);

traceCStage.height);

Хотя команды trace() не влияют на браузер, их результаты видны в режиме Test Movie после изменения размеров сцены. Если атрибуту HTML scale присвоено любое значение, отличное от литерала "noScale", свойства Stage.width и Stage, height всегда возвращают внутренние размеры Flash Stage (550 х 400 по умолчанию), хотя этот режим можно переопределить вручную в ActionScript: Stage.sealeMode = "noScale";

Режим масштабирования также можно выбрать вручную в списке Scale окна File • Publish Settings • HTML (строка No Scale). После выбора режима noScale свойства Stage.width и Stage.height возвращают размеры окна браузера. Режим noScale запрещает Flash масштабировать контент, но оставляет возможность управления масштабом из ActionScript. Обратите внимание: если задать свойству scaleMode значение "showAH", "noBorder" или "exactFit", свойства Stage.width и Stage.height возвращают размер сцены Flash, заданный в окне Modify • Document, независимо от размеров окна браузера. Следующая проблема - организовать проверку размеров сцена или окна браузера не на каждом кадре, а только при их изменении (например, когда пользователь Глава 11. Интеграция с браузером вручную изменяет размеры окна браузера). Для этого размеры будут читаться в обработчике события: var stageListener - new ObjectO;

stageListener.onResize = functionO { trace(Stage.height);

traceCStage.width);

}: Stage.sealeMode = "noScale": Stage.addLi stener(stageListener);

Допустим, мы работаем с двумя клипами. Первый, scaleable_mc, используется в качестве фона и заполняет окно браузера. Второй, centered_mc, всегда остается в центре браузера и не масштабируется. На рис. 11.16 клип scaleablejnc представлен светло-серым градиентным фоном, а прямоугольник с текстом «content» в центре изображает основное содержание сайта centered me.

:••".:••. " • " " " ф :

;

Рис. 11.16. Фоновая градиентная заливка с наложением контента Заполнение сцены контентом Flash позволяет реализовать многие возможности, отсутствующие при размещении Flash-сайта перед мозаичным GIF-фоном. В частности, мы можем легко реализовать эффекты прозрачности (тени или непрямоугольную форму основного сайта) без использования элементов ActiveX, специфических для Internet Explorer, применить анимацию или эффекты к фону. Использование векторного градиента вместо растровой графики также повышает плавность цветовых переходов. Хотя в данном примере SWF может иметь большие размеры, быстродействие падает только в том случае, если большие области экрана изменяются в каждом кадре. Градиентный фон остается неизменным, поэтому его присутствие lie отражается на быстродействии.

Динамическое масштабирование контента Следующий код (доступен в файле varyStage.fla на сайте книги) сохраняет исходную позицию и масштаб клипа content_mc, при этом клип scalablejnc изменяется в размерах и заполняет окно браузера: function stageResizeO { sealable_mc._width = Stage.width + 50: scalable_mc._height = Stage.height + 50: } Stage.sealeMode = "noScale";

myListener = new ObjectO;

myListener.onResize = functionO { stageResizeO: }: Stage.addListener(myListener);

Первыми выполняются последние шесть строк, следующие за определением функции, поэтому давайте начнем рассмотрение с них. В этом фрагменте свойству scaleMode задается значение "noScale", после чего определяется слушатель, реагирующий на событие изменения размеров окна браузера. Вся основная работа выполняется функцией stageResizeO, которая вызывается каждый раз, когда пользователь изменяет размеры окна браузера. Функция stageResizeO масштабирует фоновый клип scaleablejnc по размерам текущего окна браузера (в пикселах) с прибавлением небольшого зазора (+50), чтобы по возможности закрыть поля в браузере. Чтобы эффект работал, откройте окно File • Publish Settings • HTML, задайте свойству Dimensions значение Percent, а свойству Scale - значение Default(Show All). Чтобы предотвратить отображение полей в окне браузера, вручную отредактируйте тег в HTML-файле и приведите его к следующему виду: Также размеры полей можно задать с использованием CSS.

Итоги Многие Flash-сайты, эмулирующие «операционную систему в окне браузера», состоят из одного большого фонового SWF-ролика, всегда полностью закрывающего окно браузера. Перед ним располагается несколько SWF меньших размеров и не масштабируемых. Аналогичная методика может успешно применяться и для традиционных сайтов, с заменой векторного фона растровой графикой. Умеренное масштабирование существенно улучшает восприятие сайта без нарушения стиля текстовых Flash-сайтов с мелкими шрифтами. Возможности адаптации интерфейса к размеру окну браузера практически не ограничиваются. По адресу http://www.it2004.jp/index2.html приведен пример сложного интерфейса, который автоматически изменяет свою конфигурацию в соответствии с изменениями размеров окна. Повышение быстродействия за счет буферизации событий Stage.onResize с использованием интервальных таймеров описано по адресу http://chattyfig.figleaf.eom/ezmlm/ezmlm-cgi71:msn:62581:dggpkifkacibblilcmok.

414 ТРЮК Глава 11. Интеграция с браузером Создание ссылок H M в Flash TL Ссылки в стиле HTML обычно не включаются в Flash-контент, но, в принципе, такая возможность существует. Настоящий трюк показывает, как создать гиперссылку в стиле HTML для управления временной диаграммой Flash.

№ Средства форматирования CSS, поддерживаемые в Flash MX 2004, позволяют создавать стандартные ссылки HTML. К сожалению, такие ссылки и работают стандартно - они выполняют переход к обычным страницам, не входящим в SWF. На помощь приходит конструкция asfunction, которая позволяет ссылкам управлять SWF из ActionScript. Прежде всего следует воссоздать внешний облик гиперссылки в Flash, что делается относительно несложно. Создайте файл в своем любимом текстовом редакторе (у меня это редактор SciTE|Flash - см. трюк 74). Введите текст, показанный на рис. 11.17. Сохраните файл под именем flash.ess.

Pe Edit S ac V w Tools Options Syntax W d w H l t erh e i i o s ep n F e a T y i T a 7 i "ia к ! о"••;

• i q ^ P{ color: #000000;

font-family: sans-serif;

font-size;

Юрх;

color: #O0O0FF;

a:hover{ Ю h text-decoratton: underline;

Рис. 11.17. Содержимое файла.ess Затем создайте на сцене многострочное текстовое поле с именем myHTML txt. Добавьте следующий код для создания в поле myHTML_txt текста HTML с гиперссылкой http://www.oreilly.com: var myCss = new TextFi eld.Styl eSheet();

myCSS.load("flash.ess");

myCSS.onLoad = function(success)' { i f (success) { m H M txt.styleSheet = myCSS: yT L myHTML_txt.html = true;

myHTML_txt.htmlText = "

This is a link to m site.

";

y myHTML_txt.htmlText += "

Click i t and see!

";

Создание ссылок HTML в Flash Внешний вид гиперссылки показан на рис. 11.18. This is a linK to m site. y ClteK it and see!

Рис. 11.18. Гиперссылка HTML в Flash «Чистые» гиперссылки HTML в Flash SWF удобны для перехода к внешним страницам, но использовать их для управления текущей временной диаграммой Flash не удастся. Для решения этой задачи необходимо использовать конструкцию asfunction. В следующем листинге asfunction обеспечивает вызов функции asLink() с аргументом 10 при щелчке на ссылке;

в результате индикатор текущей позиции перемещается к кадру 10 текущей временной диаграммы S.WF. Обратите внимание: протокол asfunction: указывается в ссылке по аналогии с протоколами http: или mailto:. Браузер передает URL, начинающийся с asfunction:, модулю или элементу ActiveX Flash Player. Flash Player вызывает функцию, заданную первым аргументом после asfunction, и передает ей остальные аргументы. function asLink(goto) { gotoAndPlay(goto);

} var m C S = new TextField.StyleSheetO: yS myCSS.loadC"flash.ess"): myCSS.onLoad = function(success) { i f (success) { m H M txt.stylesheet = myCSS: yT L myHTML_txt.html = true: myHTML_txt.html Text = "

This is a1ink to frame 10.

": myHTML_txt.htmlText +» "

Click i t and see!

";

stopO:

Итоги Благодаря тому, что Flash MX 2004 поддерживает HTML и подмножество средств форматирования CSS, кнопки Flash в пользовательском интерфейсе могут использоваться совместно с гиперссылками в стиле HTML. В этом трюке показано, как использовать такие ссылки для перемещения по временной диаграмме Flash (или просто выполнения кода ActionScript). Конечно, описанный механизм также может использоваться и для построения традиционных гиперссылок на внешние страницы. Как известно, текстовые поля Flash теперь могут включать графику и текст в формате HTML (см. трюк 46), и это повышает практическую ценность данного трюка и позволяет отображать мини-страницы HTML в Flash SWF. Текстовые поля даже могут содержать другие SWF - довольно интересная альтернатива для loadMovie() и /oadMovieNum()!

41В ТРЮК Глава 11. Интеграция с браузером № Интеграция Flash с кнопкой возврата Пользователи Flash издавна жаловались на отсутствие совместимости с кнопкой возврата в окне браузера. Пора опровергнуть этот миф — кнопка возврата может использоваться для возврата в Flash-сайтах, не связанного с временной диаграммой.

Одной из целей, поставленных при проектировании Flash MX (и Flash Player 6), было повышение удобства работы. Среди прочего, фирма Macromedia добавила поддержку именованных якорных ссылок. Многие веб-дизайнеры знакомы с якорными ссылками по их HTML-прототипам. Якорная ссылка представляет собой ссылку из документа на другую часть (обычно) того же документа. Якорные ссылки часто используются в длинных текстовых документах, не помещающихся в видимой части окна браузера. Чтобы пользователю не приходилось прокручивать страницу туда-сюда, якорная ссылка позволяет быстро перейти к нужной секции. Имена якорных ссылок имеют префикс # - например, http://www.oreilly.com/index.htnnWfaq. В своей реализации якорных ссылок фирма Macromedia приравняла документы HTML к главной временной диаграмме SWF, поэтому якоря позволяют перемещаться вдоль _root с использованием кнопки возврата. Естественно, в Flash можно использовать и более традиционные средства перемещения (например, кнопки Flash, обработчики событий onRelease которых содержат операции gotoAndPlayO). К сожалению, в большинстве Flash-сайтов кадры временной диаграммы _root не используются как якорные точки. Щелчок на кнопке не вызывает переход к некоторому кадру _root, потому что это затрудняет сопровождение SWF и создает трудности при работе контентом большого объема. Вместо этого в Flash-интерфейсе типичного коммерческого приложения используется система на базе ActionScript, которая вызывает loadMovieQ с вложенными клипами или связывает контент с главной временной диаграммой. Единственное обходное решение основано на создании скрытых HTML-страниц, изменяющихся синхронно с Flash-сайтом;

именно эти скрытые страницы сохраняются в истории браузера. Когда скрытая HTML-страница изменяется из-за нажатия в браузере кнопок перехода вперед и возврата, JavaScript передает значения переменных Flash-сайту и информирует его о смене страницы. Flashсайт настроен на перехват и обработку этих изменений. Вам не удастся использовать JavaScript для чтения истории браузера и ее передачи Flash, поскольку история недоступна для JavaScript (и чего-либо иного) по соображениям безопасности - например, чтобы оградить информацию о посещенных сайтах от рекламщиков.

Создание скрытых страниц Несомненно, самый простой способ создания скрытых HTML-страниц - их включение в одну страницу с Flash-сайтом с применением фреймов. С учетом того, что у многих пользователей Flash установлен пакет Macromedia Studio MX, мы воспользуемся Dreamweaver MX (для ввода HTML-кода вы можете использовать редактор по своему выбору).

Интеграция F a h с кнопкой возврата ls В Dreamweaver MX имеется стандартный шаблон, отдаленно похожий на нужный набор фреймов. Выполните команду File • New и выберите шаблон Fixed Bottom (рис. 11.19).

Bs Pg ac a e i Dnm Pg ya c a e i Template Page Oh r te CS Sye S e t S t t h es Fa ees • rmst Pg D s n a e eg s i Pg D s n ( c e sbe a e eg s A c s i l ) i • ie ' B to ;

\ F d om x F e B to, N se Left i d o m et d x Fx d Bottom, f e t d R h ie 4 se g i Fx d Left ie fixed Left, N se B to et d o m Fx d Left, N se T p ie et d o Fx d Rg t ie i h Fx d Right, N se Bettor ie et d Fx d Right, N se T p ie et d o Fx d T p ie o Fx d T p, Fx d B to ie o. ie o m fixed Top, N se Left et d fixed T p, N se Rg t o. et d i h Split Horizontal Description: Split Vertical J fa ee split horizontally with a A rmst jfixed-size b to fa e o m rm.

.Help.;

. J Ce t r ae Cne acl Рис. 11.19. Выбор шаблона Fixed Bottom в Dreamweaver MX Наш HTML-файл Flash будет заполнять верхний фрейм, а скрытые страницы HTML будут реализованы в виде пустых страниц (содержащих только код JavaScript) в нижнем фрейме. Используя этот шаблон или его аналог, создайте приведенный ниже HTML-код. Строки, в которых сгенерированный Dreamweaver MX код был изменен, выделены жирным шрифтом. Сохраните набор фреймов под именем frame.html. 7 F L A S 100 советов и рекомендаций профессионала O'REILLY С&ППТЕР Шам Бхангал F L A S H H A C K S Sham Bhangal O'REILLT Beijing • Cambridge • Farnham • Kbln • Paris • Sebastopol > Taipei • Tokyo F L <body> You should really get a more up to date browser before they phase out steam power.</p><p> 418 </body> Глава 11. Интеграция с браузером Переходим к построению скрытых страниц. Создайте пять пустых HTML-файлов с именами one.html, two.html, three.html, four.html и five.html, сохраните их в одной папке с файлом frame.html. Отредактируйте файл one.html и приведите его к следующему виду (изменения выделены жирным шрифтом): ! O TP T L TL one Обратите внимание: тег 7 F L A S 100 советов и рекомендаций профессионала O'REILLY С&ППТЕР Шам Бхангал F L A S H H A C K S Sham Bhangal O'REILLT Beijing • Cambridge • Farnham • Kbln • Paris • Sebastopol > Taipei • Tokyo F L Чтобы набор фреймов заработал, остается создать секцию flash.html. Создайте в Flash новый документ командой File • New. Выполните команду File • Publish Settings, перейдите на вкладку HTML, выберите в списках Horizontal и Vertical из группы Flash Alignment значение Center, а в списке Scale - строку No scale, как это было сделано в трюке 90 (см. рис. 11.8). Сохраните файл Flash под именем flash.fla в одной папке с сохраненными ранее HTML-файлами. Выполните публикацию (File • Publish), чтобы создать файлы flash.html и flash.swf.

Интеграция Flash с кнопкой возврата Создание контента Flash Мы создадим простую внедренную временную диаграмму, чтобы продемонстрировать принципы работы трюка. Создайте новый символ клипа с пятью ключевыми кадрами (неважно, будет ли он именованным или нет), как показано на рис. 11.20. Каждый ключевой кадр должен представлять отдельную страницу Flash-приложения (рис. 11.21).

Рис. 11.20. Клип с пятью ключевыми кадрами, представляющими разные страницы Flash-приложения content page content page content page content page content page Рис. 1 1. 2 1. Страницы Flash-приложения Разместите клип на сцене в кадре 1 главной временной диаграммы, присвойте ему имя экземпляра content на панели свойств. Создайте меню из пяти кнопок с именами экземпляров от Ы (кнопка 1) до Ь5 (кнопка 5). Наконец, создайте над текущим слоем новый слой с именем actions. Присоедините следующий сценарий к кадру 1 нового слоя: bl.onRelease - functionO { fi11BottomC"one.html");

420 content.gotoAndStop(I): }:

Глава 11. Интеграция с браузером b.nees = fnto О { 2oRlae ucin f i l BottomC two. html");

l cnetgtAdtp2;

otn.oonSo() }:

b3.onRelease = functionО { fillBottomC"three.html");

content. gotoAndStopO): }: b4.onRelease - functionO { fillBottomC"four.html"): content.gotoAndStop(4);

}: b5.onRelease = functionO { fillBottomCfive.html");

content.gotoAndStopC5);

}: function setHistory() { i f (history == 1) { hisEnabied = true: content.onEnterframe = functionO { i f (history !- 0) { this.gotoAndStop(history);

history = 0: clearlnterval(startHistory): } function fillBottom(doc) { i f (hisEnabled) { getURLCdoc. "bottomFrame"): } var history;

var hisEnabled = false;

startHistory = setlntervaKsetHistory, 500);

content. stopO: Теперь при щелчке на каждой из кнопок не только Flash переходит к соответствующему кадру временной диаграммы, но и функция fillBottom() вызывает соответствующую HTML-страницу в нижнем фрейме веб-страницы. Страницы не видны пользователю, так как они не содержат видимого контента, однако браузер включает их в историю. Когда пользователь щелкает на кнопках Вперед (Forward) и Назад (Back), браузер подгружает страницы HTML из истории, а размещенный в.них код JavaScript присваивает переменной Flash history значение от 1 до 5, в зависимости от страницы. Обработчик onEnterFrame перехватывает изменение и заставляет контент изменяться синхронно с изменениями HTML-страницы. Таким образом, история браузера синхронизируется с передачей управления в Flash-ролике.

Интеграция Flash с кнопкой возврата Обратите внимание: при использовании кнопок Flash для перемещения контента клипа к нужному кадру переход фактически осуществляется дважды, из ActionScript и из JavaScript. В принципе переходы из ActionScript можно убрать, но лучше оставить их для надежности: они гарантируют, что система переходов будет работать даже при отсутствии поддержки JavaScript. Код ActionScript написан таким образом, что: • система переходов работает даже в том случае, если текущий браузер не поддерживает JavaScript (или SWF выполняется в Standalone Player). Flash проверяет работоспособность JavaScript в команде if (history==1) в функции setHistory(). Если поддержка JavaScript отключена, переменная history не определена;

в этом случае Flash не назначает обработчик onEnterFrame, фактически отменяя проверку истории браузера;

• взаимодействие ActionScript с JavaScript начинается с задержкой в 0,5 с. Похоже, HTML присваивает значение переменной Flash history с небольшой паузой. По этой причине ActionScript откладывает создание обработчика onEnterFrame на 0,5 с при помощи интервального таймера setlnterval().

Итоги При организации передачи управления кнопками Flash в браузере активизируются кнопки Вперед (Forward) и Назад (Back). Щелчки на этих кнопках позволяют перемещаться по истории посещаемых страниц. Отсутствие функциональности возврата считалось одним из главных неудобств Flash. Как видите, проблема успешно решается! Конечно, опытные пользователи Flash найдут в этом решении ряд недостатков. Например, необходимость создания (и сопровождения) пустой HTML-страницы для каждой страницы Flash выглядит довольно утомительно и противоречит одному из главных достоинств Flash-дизайна - отсутствию страничной ориентации. Резонно спросить: куда должен переходить пользователь при нажатии кнопки возврата в Flash-приложении? В сайтах на базе HTML каждая страница представляет состояние приложения в конкретный момент времени. Но в приложениях Flash каждая «сцена» может состоять из нескольких кадров и содержать анимацию или материалы, занимающие некоторый промежуток времени. Например, когда пользователь щелкает на кнопке возврата к предыдущей сцене, должен ли Flash-дизайнер перемотать и воспроизвести заново анимацию, аудио или видео соответствующей сцены? При выборе страниц, представляющих фиксированные моменты времени, следует учитывать состояние вашего приложения. Одно из возможных усовершенствований этого трюка - динамическое построение HTML-страниц в скрытых кадрах средствами JavaScript. В этом случае количество страниц в истории браузера не является фиксированной величиной, что обеспечивает необходимую гибкость при построении сложных Flash-сайтов. Взаимодействие JavaScript с Flash поддерживается не всеми браузерами;

эта тема обсуждается по адресу http://www.macromeclia.com/support/flash/ts/documents/ Глава 11. Интеграция с браузером java_script_comm.htm. Представленный трюк работает в Netscape и IE, но по крайней мере один пользователь сообщил об ошибке JavaScript в Mozilla 1.6. Для тестирования различных браузеров можно воспользоваться страницей Macromedia http://www.macromedia.com/support/flash/ts/docurnents/java_script_comm/ javascript_to_flash.html.

№ ТРЮК Передача фокуса клавиатуры S F W Flash обнаруживает нажатия клавиш и принимает текстовый ввод лишь после того, как SWF получит фокус ввода с клавиатуры. Настоящий трюк показывает, как передать фокус SWF, не заставляя пользователя щелкать на нем вручную.

Браузер передает фокус ввода с клавиатуры лишь после того, как SWF-ролик будет выделен (обычно щелчком мышью). А это означает, что SWF начинает реагировать на нажатия клавиш лишь после щелчка. Во многих ситуациях такое поведение нежелательно. Допустим, вы только что загрузили видеоигру, в которой игрок управляет своим игровым персонажем при помощи клавиш со стрелками. Если пользователь не щелкнет на SWF перед началом игры, команды управления попросту не воспринимаются. Стандартное обходное решение - заставить пользователя щелкнуть на SWF (обычно для этой цели создается кнопка Start, которая не выполняет никаких других функций). Существует и более удачный вариант: определить большую область для щелчка и вывести текстовую инструкцию типа «Щелкните кнопкой мыши, чтобы начать игру». И все же более элегантное решение - вообще не требовать от пользователя никаких лишних действий. К счастью, принудительная передача фокуса может быть осуществлена следующей командой JavaScript (которая лучше работает при тестировании в браузере, а не в режиме Test Movie среды разработки Flash): getURLC"javascript:me.focus();

void 0;

"): Используя метод getURLQ, эта строка вызывает метод JavaScript Window.focus() с указанием целевого файла т е (предполагается, что SWF называется me.swf). Фокус автоматически передается SWF-ролику с указанным именем.

Итоги Несмотря на столь краткое описание, этот трюк станет одним из тех мелких штрихов, которые придают профессионализм вашей Flash-презентации. Когда на экране появляется форма, пользователь ожидает, что он может сразу приступить к вводу и переключаться между текстовыми полями без предварительного щелчка. Если приложение игнорирует нажатия клавиш, это вызовет недоумение у пользователя. Данный трюк, как и предыдущий, не работает в браузерах, не поддерживающих обмен данными JavaScript/Flash (например, Mozilla).

Клавиши ускоренного вызова ТРЮК Клавиши ускоренного вызова Чтобы работа с Flash-приложением стала более быстрой и удобной, свяжите с каждой кнопкой SWF специальную клавишу или комбинацию клавиш.

№ Клавиши ускоренного вызова делают сайт более удобным. В настоящем трюке показано, как реализовать клавиатурные сокращения с минимальным объемом программного кода. Стоит заметить, что идентификация ввода с клавиатуры не сводится к простой проверке нажатой клавиши. Необходимо предусмотреть обработку комбинаций клавиш (например, Ctrl+Q) и обнаруживать как нажатия, так и отпускания клавиш.

Обнаружение нажатий клавиш Чтоб проверить состояние клавиатуры, необходимо предварительно создать объект-слушатель для класса Key. Следующий фрагмент выводит сообщение каждый раз, когда обнаруживает нажатие клавиши: function down О { trace("detected!");

} var KeyListener:Object = new ObjectO: KeyListener.onKeyDown = down;

i Key.addLi stener(keyLi stener);

При анализе клавиатурного ввода класс Key не различает символы верхнего и нижнего регистров. Например, класс Key возвращает один и тот же код клавиши независимо от того, была ли в момент нажатия клавиши А нажата клавиша Shift или активизирован режим Caps Lock. Недостаток приведенного кода заключается в том, что функция выполняется в течение всего времени, пока клавиша остается нажатой;

из-за этого код не подходит для обнаружения комбинаций клавиш, поскольку нажатие клавиши и ее удерживание приводит к многократному генерированию событий. Чтобы решить проблему, следует организовать такую обработку событий, чтобы для каждого цикла нажатия/отпускания клавиши выдавалось только одно сообщение «detected!». Задача решается следующим кодом: function downO { trace("detected!");

delete this.onKeyDown;

this.onKeyUp = up: } function up() { this.onKeyUp = undefined;

this.onKeyDown = down;

} var keyListener:Object = new ObjectO;

keyListener.onKeyDown = down;

key.addListener(keyListener);

Глава 11. Интеграция с браузером Обнаружив событие onKeyDown, программа переключается в режим поиска парного события onKeyUp. По событию onKeyUp цикл запускается заново. Таким образом организуется обработка нажатия и отпускания клавиш. Обратите внимание: этот код работает даже при вводе комбинации клавиш (например, Ctrl+A). В этом случае сообщение «detected!» выводится для каждой клавиши.

Преобразование нажатий клавиш во входные символы Итак, мы получили возможность обнаруживать нажатия клавиш. Но на самом деле мы хотим узнать, какие именно клавиши были при этом нажаты. Для решения этой задачи применяются методы Key.isDown() и Key.getCode(). Первый метод проверяет, была ли нажата заданная клавиша, а второй возвращает код последней клавиши, инициировавшей событие (то есть последней клавиши, изменившей свое состояние;

эта клавиша не всегда совпадает с той, которая нажата в настоящий момент). Например, если одновременно нажать клавиши А и S, а затем отпустить клавишу А, то метод getCode() вернет код клавиши А, хотя клавиша S остается нажатой. Учтите, что класс Key возвращает коды физических клавиш и не учитывает состояние модификаторов. Например, при нажатии клавиши X всегда возвращается один и тот же код независимо от состояния клавиш Shift и Ctrl. В электронной документации приведена таблица кодов алфавитно-цифровых кодов клавиш. Чтобы найти ее, выполните поиск по фразе «Keyboard keys and keycode values». Для клавиш, не являющихся алфавитно-цифровыми (например, клавиш управления курсором и пробела), можно воспользоваться константными свойствами класса Key). Например, константа Key.SPACE содержит код пробела, а константа Key.CONTROL содержит код клавиши Ctrl. Пример: х = Key.isDown(65);

// х = true, если нажата клавиша А х = Key.getCodeO: // у = 65. если событие инициировано клавишей А Зная код клавиши, мы можем легко написать сценарий ActionScript для обнаружения нажатий отдельных клавиш. Допустим, на сцене размещены три кнопки с именами экземпляров buttonA, buttonB и buttonC. Следующий листинг выполняет обработчик onRelease каждой из кнопок А, В или С. Кроме того, фокус передается кнопке, связанной с нажатой клавишей, вследствие чего кнопка (среди прочего) выделяется желтым прямоугольником: function аНапсПегО { traceC'you clicked A"): } function bHandlerO { traceC'you clicked В");

} function cHandlerO { traceC'you clicked C"):

Клавиши ускоренного вызова function down О { i f (keys [Key. getCodeO] !- undefined) { keys[Key.getCode()].onRelease();

Selecti on.setFocus(keys[Key.getCodC)]);

} this.onKeyDown = undefined;

this.onKeyUp = up: } function up() { this.onKeyUp = undefined;

this.onKeyDown = down;

var keys:Array - new ArrayO;

var keyl_istener:Object = new ObjectO: keys[65] = buttonA;

keys[66] = buttonB;

keys[67] = buttonC;

buttonA.onRelease = aHandler: buttonB.onRelease = bHandler;

buttonC.onRelease = cHandler;

keyListener.onKeyDown = down;

Key.addListener(keyListener);

Программа создает массив keys, индексы которого ассоциируются с кнопками Flash. Например, кеу[65] содержит ссылку на кнопку buttonA, поэтому при нажатии клавиши А (код 65) выполняется обработчик события buttonA.onRelease(). На рис. 11.22 изображены кнопки buttonA, buttonB и buttonC до (слева) и после (справа) нажатия клавиши А. При нажатии клавиши А на панели Output появляется сообщение «You clicked A».

«.А •А •В •С #В •С Рис. 11.22. Кнопки без выделения (слева);

кнопка А выделена (справа) Чтобы Flash Player регистрировал нажатия клавиш, необходимо передать SWF фокус (см. трюк 65). Фокус сохраняется до тех пор, пока пользователь не щелкнет мышью на контенте за пределами SWF. Простое перемещение указателя мыши приводит к потере фокуса кнопкой, поэтому, если во время нажатия клавиши А перемещается мышь, желтый прямоугольник выделения может и не появиться. Чтобы протестировать SWF-ролик, распознающий нажатия клавиш, выполните команду Control • Disable Shortcuts в режиме Test Movie. Flash перестает обрабатывать нажатия клавиш, искать собственные служебные комбинации и скрывать их от тестируемого ролика.

Глава 11. Интеграция с браузером Преобразование комбинаций клавиш во входные данные Во многих приложениях одиночными клавишами ускоренного вызова поддерживаются также управляющие комбинации (например, Ctrl+F1). Было бы разумно организовать обработку таких комбинаций. Тем не менее, при использовании комбинаций клавиш для управления Flash необходимо действовать осторожно, потому что Flash редко оказывается в начале очереди обработки. Большинство стандартных комбинаций перехватывается операционной системой или браузером, и до Flash такие комбинации не доходят. В нашей программе комбинация будет задаваться массивом объектов с описанием клавиш, которые должны одновременно удерживаться для формирования входной комбинации. Допустим, мы хотим использовать: • клавишу А для кнопки buttonA;

Узнайте, что такое Саентология...

Ваша жизнь поменяется...

• комбинацию Ctrl+B для кнопки buttonB;

• комбинацию Ctrl+D для кнопки buttonN. Эта информация кодируется следующим массивом объектов: keys[0] = {btn:buttonA. combo:[65]};

keys[l] = {btn:buttonB. combo:[Key.CONTROL. 66]};

keys[2] = {btn:buttonC. combo:[Key.CONTROL. 68]}: Каждый элемент массива keys представляет собой объект с двумя свойствами: • свойство keys[].btn определяет кнопку Flash, с которой связывается комбинация;

• свойство keys[].combo содержит массив с перечислением клавиш, входящих в комбинацию. В следующем листинге структура данных keys[] используется для определения клавиатурных эквивалентов трех кнопок: buttonA, buttonB и buttonC. Нетривиален разве что способ, которым мы проверяем нажатие полной комбинации. Для каждой комбинации программа: • присваивает логической переменной allKeys значение true;

• проверяет, нажата ли каждая клавиша, входящая в комбинацию, при помощи метода Key.isDown(keys[j].combo[i]). Выражение истинно, если клавиша нажата, и ложно в противном случае. Полученный результат объединяется операцией && со значением allKeys. Если хотя бы одна клавиша не нажата, переменная allKeys становится равной false и сохраняет это значение до конца цикла;

• если в конце цикла переменная allKeys все еще равна true, мы знаем, что нажаты все клавиши, входящие в комбинацию. Для формирования переменной allKeys не важны порядок нажатия клавиш или их количество, именно поэтому так удобен логический оператор &&. Если переменная allKeys равна true, дальнейшая процедура почти не отличается от обра Клавиши ускоренного вызова ботки одиночных клавиш. В следующем листинге изменения выделены жирным шрифтом: function aHandlerO { trace("you clicked A");

} function bHandlerO { traceCyou clicked B");

} function cHandlerO { traceC'you clicked C");

} function down О { var all Keys;

//tracer "): f r (var j = 0;

j

j++) { o all Keys = true;

for ( a i = 0;

i

this.onKeyDown = undefined;

this.onKeyUp = up;

keys[j].btn.onRelease();

break;

} function up() { //traceCup"): this.onKeyUp = undefined;

this.onKeyDown = down;

} // var keys:Array = new ArrayO: var keyListener:Object = new ObjectO;

keys[0] = {btn:buttonA. combo:[65]};

keys[l] = {btn:buttonB. combo:[Key.CONTROL. 66]};

// Ctrl-В keys[2] = {btn:buttonC. combo:[Key.CONTROL. 68]};

// Ctrl-D buttonA.onRelease = aHandler;

buttonB.onRelease = bHandler;

buttonC.onRelease = cHandler;

keyListener.onKeyDown = down;

Key. a d i s e e ( e L stener);

dL tnrkyi Я оставил некоторые полезные вызовы trace(), использовавшиеся в процессе разработки. Если вы хотите увидеть, как и в каком порядке программа обнаруживает и сбрасывает обработчики событий onKeyDown, onKeyUp и onRelease, уберите комментарии в вызовах traceQ и проанализируйте порядок возникновения событий на панели Output. Логика программы мгновенно прояснится.

Глава 11. Интеграция с браузером Комбинация клавиш Ctrl+В не будет работать при тестировании ролика в Flash, если вы забудете отключить клавиши ускоренного вызова, потому что комбинация Ctrl+B в Flash открывает Bandwidth Profiler. Комбинация Ctrl+C не работает, потому что она перехватывается другими приложениями (скорее всего, средствами копирования в буфер операционной системы), поэтому для кнопки С была выбрана комбинация Ctrl+D. Впрочем, при тестировании SWF в браузере комбинация Ctrl+B тоже может вызвать проблемы, поскольку в Internet Explorer она используется для упорядочения «избранного». Мораль: всегда убеждайтесь в том, что выбранные вами комбинации клавиш не используются для других целей другими приложениями, работающими одновременно с Flash SWF, иначе Flash их попросту не увидит!

Итоги Поддержка клавиатурных комбинаций наряду с управлением мышью сделает сайт более доступным как для пользователей с дефектами зрения, так и для опытных пользователей с навыками слепой печати. Комбинации клавиш на удивление редко поддерживаются Flash-сайтами - может быть, из-за того, что их программная реализация относительно нетривиальна. Что же, теперь вы знаете, как это делается!

ГЛАВА 1 Безопасность Т ю и № 97-100 рк Пользователь может быстро загрузить исходные файлы сайта иа базе HTML и просмотреть их без разрешения разработчика. HTML-страница по определению представляет собой текстовый файл, передаваемый браузеру пользователя или любому клиенту, от которого поступил запрос. Браузер или программа «закачки сайтов» легко загружает любой текст и графику, отображаемые на странице. К сожалению, законы об авторских правах не предоставляют сколько-нибудь серьезной защиты, особенно за пределами США и Европы, поэтому большинство владельцев сайтов либо допускает возможность копирования контента, либо пытается принять технологические меры защиты. В простейшем случае разработчик может включить в изображение визуальную информацию об авторских правах;

пиратам придется по крайней мере стереть этот знак, чтобы замести следы. Если автор настроен более радикально, он может включить в изображение невидимый «водяной знак», предотвращающий несанкционированное воспроизведение. Конечно, все меры «цифровой защиты» могут быть вскрыты, но здесь мы не будем обсуждать все технические и политические аспекты этой темы. Двоичный файловый формат SWF не удастся прочитать с такой же легкостью, как текстовый файл, но особой дополнительной защиты он не обеспечивает. Для его расшифровки достаточно воспользоваться программой чтения формата SWF, описание которого находится в открытом доступе по адресу http://www.macromedia.com/ software/flash/open/licensing/fileformat (лицензия выдается бесплатно, но формат SWF является интеллектуальной собственностью Macromedia, а не общественным достоянием). Разработчикам, собирающимся писать программы для создания SWF-файлов, достаточно посетить OpenSWF.org (http://www.openswf.org) - сайт ресурсов для разработчиков, работающих с форматом SWF. В настоящее время существует немало декомпиляторов Flash SWF и программ извлечения контента, включая ActionScript Viewer (http://buraks.com/asv) - первую программу такого рода, появившуюся на рынке несколько лет назад. Итак, SWF-файлы уязвимы в той же степени, что и традиционные веб-ресурсы. Ничто не помешает изобретательному хакеру просмотреть ваши ресурсы и код, поэтому в файлах SWF не следует хранить конфиденциальную информацию (например, пароли). И все же задачу хакера стоит по крайней мере усложнить, потому что многие злоумышленники быстро сдаются, столкнувшись с трудностями, или подыскивают более доступный сайт.

Глава 12. Безопасность Впрочем, кража контента - не самая серьезная проблема. Большее внимание приходится уделять вопросам общей безопасности. В традиционном веб-дизайне конфиденциальная информация ни в коем случае не должна храниться в загружаемых файлах или в любых файлах, которые могут быть легко открыты или скопированы. Вместо этого защищенные данные передаются напрямую между клиентским браузером и веб-сервером. Такие данные не сохраняются браузером, однако и они могут быть перехвачены. Flash не содержит собственной реализации протокола безопасности, а использует поддержку шифрования, предоставленную браузером. Таким образом, при вводе URL с префиксом протокола https: Flash использует для передачи данных сервис HTTPS браузера (если он поддерживается). Следовательно, вы должны убедиться в том, что браузер пользователя поддерживает HTTPS, и воспользоваться сервером HTTPS для шифрования всей передаваемой информации. Например, так называемое поле ввода пароля, активизируемое как разновидность текстовых полей с панели свойств, не обеспечивает безопасности. Оно просто заменяет вводимые символы звездочками, но допускает пересылку пароля на сервер в виде простого текста. Даже если читатель не знаком с безопасностью пересылки данных, он должен понимать, что пересылка конфиденциальных данных (паролей, данных кредитных карт и т. д.) в виде простого текста по открытому каналу создает огромный риск. Анализатор пакетов может легко перехватить весь трафик между клиентом и сервером. Зашифрованная информация тоже перехватывается, но ее не удастся прочитать с такой же легкостью, как простой текст, поэтому перехват не принесет особой пользы злоумышленнику. Использование надстроек Flash (например, Flash Communication Server MX, или FlashCom) также создает некоторые проблемы безопасности. Поток данных FlashCom (аудио или видео) не может считаться безопасным, потому что небезопасен протокол передачи данных (RTMP, или Real Time Messaging Protocol). Тем не менее, приложения FlashCom могут использовать защищенный сервер для обычной пересылки данных HTTPS. Безопасность FLashCom рассматривается в статье «Macromedia Flash Communication Server MX Security Overview» по адресу http://wvvw.macromedia.com/devnet/mx/flashcom/articles/security_overview.html. Недостаточная защита кода, работающего на стороне сервера, также создает угрозу для безопасности. При использовании технологии Flash Remoting разработчик пишет серверный код на различных языках, включая SSAS (Server-Side ActionScript), поддерживаемый ColdFusion и JRun. Код SSAS, как и код многих серверных сценарных языков, хранится на сервере в простых текстовых файлах;

файлы ActionScript Remote имеют расширение.asr. Но в конфигурации по умолчанию многие веб-серверы, в том числе Apache и Microsoft IIS, не включают расширение.asr в список типов файлов, запрещенных к просмотру. Следовательно, если пользователь введет URL файла с расширением.asr, он сможет загрузить его и просмотреть код в виде простого текста! Это создает серьезную брешь в системе безопасности, потому что некоторые разработчики ColdFusion и JRun используют SSAS для запросов к базам данных или операций с файловой системой на сервере. Прочитав содержимое файла.asr, хакер получит информацию о структуре базы данных или файловой системы, которая упростит поиск уязвимых мест вашей системы.

Безопасность ПРИМЕЧАНИЕ Разработчик Server-Side ActionScript должен настроить конфигурацию веб-сервера так, чтобы файлы.asr не считались простыми текстовыми файлами.

Безопасность Flash - слишком обширная тема, чтобы ее можно было полностью изложить на страницах книги, однако она неплохо документирована. На странице Macromedia Flash Developer Center no адресу http://www.macromedia.com/devnet/ mx/flash/security.html находятся ссылки на дополнительные статьи, посвященные безопасности Flash MX и Flash MX 2004 (Flash Player 6 и 7) и изолированной зоне, в которой они работают (для предотвращения заражения вирусами, атак типа «отказ в обслуживании» и т. д.). Многие проблемы безопасности Flash присущи и другим веб-технологиям, однако у Flash также имеются специфические аспекты: • Flash Player 6 и 7 поддерживают загрузку данных с локально подключенного микрофона или видеокамеры. Flash также может сохранять информацию на локальном жестком диске, но объем такой информации может существенно превосходить объем типичных браузерных файлов cookie. Параметры конфиденциальности Flash позволяют ограничить доступ Flash Player к микрофону, камере и жесткому диску;

• для управления доступом из контента, принадлежащего одному домену, к контенту другого домена фирма Macromedia использует междоменные политики;

ш Flash может работать независимо от браузера в Standalone Player (см. раздел «Локальные исполняемые файлы»).

Параметры конфиденциальности Flash может получать доступ к потокам данных на локальном (клиентском) компьютере, в том числе и к данным с подключенного микрофона и видеокамеры. Кроме того, Flash позволяет организовать локальное хранение информации (см. трюк 44) с использованием класса SharedObject в так называемых объектах LSO (Local Shared Objects). Однако возможности получения ввода с микрофона или камеры, подключенной к компьютеру, а также сохранения данных на жестком диске создают целый ряд проблем из области конфиденциальности и безопасности. По этой причине Flash Player должен иметь разрешение пользователя на выполнение любых действий, способных повредить конфиденциальности. Такие разрешения предоставляются на доменном уровне в окне Macromedia Flash Player Settings, показанном на рис. 12.1. Macromedia Flash Player Settings 1 Privacy % I Ao Iccel to access you? camera «sf lw rr | mter-ophima'r' # О Al lew ! El Rememba* Q ф Deny I Aavar c&d,. I Рис. 1 2. 1. Диалоговое окно Flash Player Settings Глава 12. Безопасность Это окно появляется над воспроизводимым SWF-роликом в нескольких ситуациях: • взаимодействие с пользователем. Пользователь щелкает на SWF правой кнопкой мыши (Windows) или с нажатой клавишей §§ (Мае) и выбирает в контекстном меню команду Settings;

• по требованию контента. Flash Player отображает окно в том случае, если работающий SWF-ролик пытается использовать любые средства, создающие потенциальную угрозу для конфиденциальности пользователя (если ранее пользователь не предоставил соответствующее разрешение для домена с установкой флажка Remember);

• по вызову из ActionScript. Вызов System.showSettings(n), где п = О, 1,2 или 3, открывает панель Settings на соответствующей вкладке: Privacy (0), Local Storage (1), Microphone (2) или Camera (3). Если аргумент не указан, окно открывается на последней открытой вкладке. Например, окно может вызываться из обработчика кнопки или перед попыткой сохранения локальных данных. Диалоговое окно Settings содержит вкладки для управления параметрами конфиденциальности, локального хранения данных, микрофона и камеры. Дополнительные параметры Player настраиваются только на странице Settings Manager веб-сайта Macromedia (http://www.macromedia.com/support/documentation/en/flashpiayer/ help/settings_manager.html). ПРИМЕЧАНИЕ Settings Manager вызывается кнопкой Advanced на вкладке Privacy диалогового окна Settings. На сайте Macromedia пользователь может задать глобальные и доменные параметры, относящиеся к конфиденциальности, безопасности, хранению данных и оповещениям об обновлениях.

В следующем листинге приводится базовый код для управления разрешениями локального микрофона. Другие возможности Flash, в работе которых задействованы разрешения, реализуются несколько иначе, но общий принцип остается тем же. Предполагается, что на сцене размещено динамическое многострочное текстовое поле с именем экземпляра myStatus. Для получения оптимального результата проведите тестирование в браузере (команда File • Publish Preview • Default(HTML) или клавиша F12). 1 function micPermissionO { 2 i f (myMic.muted) { 3 m S a u. e t = " s r d n e permission.";

yttstx Ue eid 4 }es { le 5 m S a u. e t = " s r gave permission.";

yttstx Ue 6} 7} 8 // Создание о ъ к а M c o h n и с я ы а и его бет irpoe взвне 9 // с т к щ й в е е н й д а р м о. еуе рмно игамй 10 var m M с;

Microphone = Microphone, g t О;

yi e 11 this.attachAudio(myMic);

12 // П о е к с о с в m t d т к щ г м к о о а рвра вйта ue еуео ирфн 13 if (myMic.muted) { Безопасность 14 15 16 17 18 19 myMic.onStatus = micPermission: myStatus.text = "Either user will always deny access to the " + "microphone, or user is looking at the Microphone Settings panel " + "and function micPermissionО will soon run.";

} else { myStatus.text = "User has already given permission.";

20 } В строках 10 и 11 создается экземпляр Microphone (хотя Flash позволяет выбрать микрофон из списка, лучше воспользоваться приведенным кодом, который выбирает микрофон по умолчанию). Flash считает, что микрофон подключен к любому оборудованию, к которому его можно подключить;

в эту категорию входят все звуковые платы, обнаруженные в системе. На большинстве компьютеров микрофон по умолчанию является единственным подключенным микрофоном! При обращении к микрофону методом Microphone.get() Flash автоматически открывает окно Settings, если соответствующее разрешение ранее не было предоставлено пользователем. При желании используйте вызов System.showSettings(2) и откройте окно «вручную» (например, если вы предпочитаете выдать запрос к пользователю в начале работы приложения, не дожидаясь, пока приложение попытается обратиться к микрофону). Если пользователь ранее разрешил использовать микрофон на вашем сайте, то свойство myMic.muted равно false, сценарий выводит текст «User has already given permission», и микрофон оказывается доступным для Flash. Если же свойство myMic.muted равно true, то пользователь либо еще не разрешил использовать микрофон, либо задал параметры конфиденциальности таким образом, чтобы доступ к нему с вашего сайта стал невозможным. Если потребуется, Flash вызывает окно Settings, и программа ждет смены разрешения пользователем. После закрытия окна Settings вызывается функция micPermission, и дальнейшая работа программы зависит от значения свойства muted (true или false). Но если пользователь уже запретил доступ к микрофону при предыдущем посещении вашего сайта, то разрешение не дается и функция micPermission() не выполняется, поскольку состояние остается неизменным. Программа завершается с выводом сообщения в строках 15-17. В принципе, вы можете потребовать у пользователя необходимое разрешение, вызвав окно Settings методом System.showSettings(2), но лучше кратко объяснить, почему ничего не происходит, и затем предоставить пользователю самому выбрать курс дальнейших действий.

Междоменная политика Фирма Macromedia определила систему жестких правил (в терминологии Macromedia - изолированная среда), управляющих взаимодействием SWF-файлов друг с другом, а также исполняемыми файлами в Веб или на локальном жестком диске. Многие из этих правил в Flash Player 7 были ужесточены по сравнению с предыдущими версиями (и многими другими веб-технологиями). Некоторые сайты, нормально работающие в Flash Player 6, отказываются работать в Flash Player 7 из-за дополнительных ограничений безопасности;

за дополнительной Глава 12. Безопасность информацией обращайтесь к статье по адресу http://www.macromedia.com/devnet/ mx/flash/articles/fplayer_security.html. Междоменная политика Macromedia определяет, может ли SWF загружать данные или обмениваться ими с другими SWF или контентом из других доменов. В частности, для Flash Player 7 по умолчанию используется следующая политика: • • • SWF не разрешается загружать другие SWF, не принадлежащие к тому же домену;

SWF не разрешается обмениваться данными с другими SWF (то есть использовать класс LocalConnection), не принадлежащими к тому же домену;

SWF не разрешается загружать ресурсы из других доменов.

Вы можете изменить политику по умолчанию и разрешить SWF взаимодействие с другими доменами: • В технической статье «Cross-Domain Policy» (http://moock.org/asdg/technotes/ crossDomainPolicyFiles) обсуждаются условия, приводящие к выдаче диалогового окна с предупреждением при воспроизведении SWF формата Flash Player 6 в Flash Player 7 и сбоям при загрузке данных в SWF формата Flash Player 7.

• Техническая статья «Macromedia Flash Security Sandbox» (http://www.macromedia.com/support/flash/ts/documents/security_sandbox.htm) посвящена изолированной зоне Flash Player 7 - «оболочке» Flash Player, которая ограничивает доступ к приватным данным и предотвращает выполнение потенциально небезопасных приложений. • Техническая статья 16520 «Loading Data Across Domains» (http://www.macromedia.com/support/flash/ts/documents/load_xdomain.htm) объясняет, какие операции разрешены или запрещены при попытках загрузки ресурсов из доменов, отличных от того, в котором выполняется SWF. • В технической статье 14213 «External data not accessible outside a Macromedia Flash movie's domain» (http://www.macromedia.com/support/flash/ts/documents/ loadvars_security.html) рассматриваются ограничения на загрузку данных (обычно с использованием класса LoadVars) из доменов, отличных от того, в котором выполняется SWF.

Обработчик события LocalConnection.allowDomain() позволяет задавать другие домены, из которых SWF может создавать локальные подключения к текущему SWF. • Метод System.Security.allowDomain() позволяет задать домены, которым разрешена загрузка вашего SWF-файла. • Если Flash-ролик, передаваемый по протоколу HTTP, пытается обратиться к защищенному контенту HTTPS, по умолчанию операция «тихо» завершается сбоем. В Flash MX 2004 появился метод System.Security.allowlnsecureDomain(), при помощи которого SWF-файлы, опубликованные в формате Flash Player 7, могут разрешать доступ HTTP/HTTPS (делать это не рекомендуется из-за угрозы для безопасности HTTPS, но такая возможность может оказаться необходимой для предоставления доступна к HTTPS-файлам, опубликованным для Flash Player 7 и выше, из HTTP-файлов, опубликованных для Flash Player 6).

• Восстановление контента по SWF • Веб-программа настройки Settings Manager вызывается кнопкой Advanced на вкладке Privacy диалогового окна Settings. После перехода на сайт Macromedia пользователь настраивает глобальные и доменные параметры, связанные с междоменными политиками.

Локальные исполняемые файлы Легкомысленное отношение к исполняемым файлам, принятым через Веб, быстро приводит к нарушениям в работе системы. Чтобы Flash Player не мог выполнить код, зараженный вирусом, среда ActionScript.находится под жестким контролем. SWF-файлу, выполняемому в модуле или элементе ActiveX Flash Player, не разрешается запускать исполняемые файлы на компьютере пользователя (например, вызовом fscommand("exec")). Тем не менее, SWF-файл, выполняемый в Standalone Flash Player, может запускать внешние приложения вызовом fscommand("exec"), как описано по адресу http://www. macromedia. com/support/flash/ts/documents/fscommand_projectors. htm. Standalone Flash Player, как и любое настольное приложение, создает потенциальную угрозу для безопасности. Для снижения этого риска^ Macromedia разрешает выполнять функцией fscommand("exec") только те файлы, которые хранятся в подкаталоге FSCOMMAND (с произвольным регистром символов) каталога, содержащего Standalone Flash Player. Теперь, когда вы получили представление о проблемах безопасности при использовании Flash, мы переходим к трюкам, которые помогут защитить контент (см. трюк 98) от наиболее вероятных видов атак (см. трюк 97).

ТРЮК В с т н в е и кнет по S F о с а о л н е отна W SWF-файлы могут быть «взломаны» специальными программами, называемыми декомпиляторами SWF. Используйте эти программы для восстановления контента при утрате исходного документа FLA.

№ Представьте, что вам поручено обновить Flash-сайт. Если вы занимались его разработкой и своевременно позаботились об архивации, все исходные файлы окажутся в вашем распоряжении. К сожалению, на практике такое бывает нечасто. Прежде чем переходить к методам защиты SWF от кражи контента (см. трюк 98), рассмотрим несколько ситуаций, в которых декомпиляция SWF оправдана законными целями. Возможно, вы не располагаете последними версиями исходных файлов, потому что: • • • клиент внес свои изменения в предоставленную версию. В этом случае вам нужна последняя версия как отправная точка для дальнейшей работы;

разработкой занимался другой специалист, который покинул мультимедийное программирование и отправился делать карьеру в Голливуде;

клиент предусмотрительно затребовал FLA-файлы по условиям контракта, но системный администратор посчитал, что эти файлы все равно лежат гденибудь на сервере, и удалил все, что ему показалось лишним. Теперь он Глава 12. Безопасность П • говорит: «Подумаешь, ведь вы все равно можете загрузить исходные тексты с сервера, верно?» К сожалению, нет;

• вы занимались исходной разработкой сайта, но с тех пор успели дважды переехать в новый офис, а последний компакт-диск с архивом, который вам удалось найти, содержит неполную или старую версию сайта. Или вы запаковали все файлы, включая JPEG и МРЗ, в ZIP-файл, но весь архив был испорчен, а его содержимое не подлежит восстановлению. Так что на практике нередко приходится работать, располагая только имеющимися на сервере файлами SWF и HTML. Восстановить полный файл FLA уже не получится, поскольку в процессе компиляции в SWF Flash удаляет существенные части содержимого FLA. И все же не исключено, что восстановить проект на базе декомпилированных данных будет проще, чем начинать все с самого начала. ПРИМЕЧАНИЕ Если при сохранении SWF-файла не был установлен флажок Protect from Import (File • Publish Settings • Flash), файл можно открыть прямо в среде Flash. Это хорошо для тех, кто пытается восстановить потерянный контент, и плохо для тех, кто пытается скрыть свой контент от других (см. трюк 98).

Хотя ничто не мешает вам написать собственную версию декомпилятора на базе описания формата SWF, в настоящее время существует несколько декомпиляторов (как бесплатных, так и коммерческих). Вот лишь некоторые из них: • ActionScript Viewer (http://buraks.com/asv) - самый первый, весьма уважаемый декомпилятор;

• Flash Decompiler (http://www.flash-decompiler.cpm) - как утверждается в описании, быстр и прост в использовании;

Sothink Decompiler (http://www.srctek.com/flashdecompiler) - обеспечивает поддержку ActionScript 2.0 и инструмент SWF Catcher для извлечения файлов из кэша браузера;

• Flare (http://www.nowrap.de/flare.html) - бесплатный декомпилятор, работающий в системах Windows, Linux и Mac OS (также доступны версии режима командной строки). Версия для Windows поддерживает декомпиляцию из контекстного меню, вызываемого правой кнопкой мыши. Декомпилятор анализирует байт-код SWF-файла и извлекает фрагменты программного кода в исходные файлы или переводит их в форму, которая снова сделает возможным их редактирование. Работа с декомпилятором будет рассматриваться на примере ActionScript Viewer (ASV). Бесплатная пробная версия ASV 3.0 загружается с сайта http://buraks.com/ asv. Пробная версия ограничена по функциональности: она декомпилирует только первые 5 кадров каждой временной диаграммы и первые 25 строк каждого сценария и не поддерживает Flash 7 (в последней полной версии, ASV 4.0, такая поддержка присутствует). Тем не менее, она позволяет составить представление Восстановление контента по SWF о процессе декомпиляции и о том, что вы можете (и не можете) сделать. Даже если SWF-файл был защищен от импортирования, ActionScript Viewer позволяет сбросить флаг защиты (вкладка Special Tags), что дает возможность импортировать файл в Flash.

Интерфейс A V 3.0 S Если открыть SWF-файл в ASV, вы увидите окно, примерный вид которого показан на рис. 12.2. Впрочем, вкладок может быть меньше, потому что некоторые вкладки оказываются не подходящими для текущего SWF. \Docunwnts and ;

ripU Special Tags} •: Wo sMoi J,JU:<™L : "Demo Level to. T S m o 2 Text y bl 5 fjjja S m o 2 Button ! ! [starLbtn] y bl 4 : (gameScore) "0.. i f S m o 2 EditableText y bl 2 111 S m o 20 MovieClip. y bl [lifeO3] 5 frames Я Symbol 18 MovieClip [back] 1 frames C 31 5 gmL o a eo p C?28 BM function soundtrack () { soundtrack_snd. attachS ound(nextLoop);

soundtrack snd.start(0,1);

} start_btn.onFielease = function () { playQ;

soundtrack_snd = n w S u d (this);

e on nextLoop = "tracki";

soundtrackQ;

s u dr c _ n. n o n C m l t = soundtrack;

o n ta k s do S u d o pee g m S oe = 0;

a e cr flash = n w C l r (back);

eo o Property [Value Timeisec.) 0.00 | Has frame actions;

yes I Has clip actions no Has start sound i no Has sound strea... yes Has sound strea... no Рис. 12.2. Интерфейс ActionScript Vjewer 3. Выбор настроек чрезвычайно широк, но для получения FLA необходимо выполнить всего три операции: • извлечь листинги ActionScript;

• просмотреть временную диаграмму вместе с содержимым каждого ключевого кадра. Вы также должны знать все имена экземпляров;

• извлечь содержимое библиотеки вместе со всеми идентификаторами компоновки. Все три операции кратко описаны в следующих разделах.

Глава 12. Безопасность Извлечение ActionScript Чтобы просмотреть весь код ActionScript, содержащийся в SWF, перейдите на вкладку ActionScripts (рис. 12.3) и выделите любой из сценариев, перечисленных на панели. Код отображается в левом нижнем углу. Чтобы сохранить сценарий в виде текстового файла, выполните команду Utility • Save ActionScript (as Text). Если окно Flash открыто в настоящий момент, код ActionScript также можно скопировать из ASV в буфер и вставить в открытый документ FLA.

nlM M JLJ Jjmeline | Fj;

ames j L'brary ] instance names j Type I:.frame action *' Frame action Щ} Frame action Ф) Frame action I Location P;

.Timeline:: 3 Timeline Щ Timeline Symbol 16 MovieCI.. Е ' а т е N o ! Instance of function soundtrack () { soundtrack_snd. attachS ound(nextLoop);

souridtrack_snd.r.^""'""'*A } i Щ\ Copy Actionscript (as Text) start_btn.onReleasi у ' UFj Change Actionsaript Font soundtrack_snd - ij |jp show Long Actronscripts FS Ctrl-КЗ »un*acku- ' a C i I I W o r d w a * > Actionscripts Ctrl +W soundtrack_snd.orH||j Colorize Actionscripte Ctrl+Alt+Z fff^JtshowA^ons.a.P-code FH 1- Force Flash 5 Mode FS Рис.

12.3. Вкладка ActionScripts в окне ActionScript Viewer 3. Просмотр исходной временной диаграммы Перейдите на вкладку Timeline и просмотрите реконструированную временную диаграмму (рис. 12.4). На первом слое временной диаграммы показаны все метки кадров и код Action Script, связанный с кадрами. ASV воссоздает остальные слои так, как в его представлении выглядят слои контента, необходимые для реконструкции работающего FLA. Временную диаграмму можно экспортировать в виде серии SWF-роликов (по одному на каждый реконструированный слой). Простые слои, не содержащие кадрированной анимации или большого количества ключевых кадров, разумнее всего просто воспроизвести в новом документе FLA. В этом случае необходимо знать имена всех экземпляров на временной диаграмме. Список имен можно просмотреть на вкладке Instance Names (если списка нет, это зна Восстановление контента по SWF чит, что имена экземпляров не использовались, - ситуация типична для SWF, не содержащих сценарного кода). ASV не может восстановить исходные слои временной диаграммы и имена символов библиотеки, существующие в FLA только в процессе разработки. Декомпилятор пытается реконструировать недостающую информацию и использует имена вида Symbol 23 или Layer 6. Слои, не содержащие контента в исходном документе FLA (в том числе опорные слои и папки), не экспортируются в SWF, поэтому декомпилятор не сможет их восстановить.

••••••• • • • • • •. :. • :. •.••••:••-,:••:..•..:••:,.:. • s \ S h e u n B V Jimeline: I Fa e j library J Instance nms j Fa e L b l j Actionscripts. j ^ rm s a e rm a e s.

3-е 4J Щм A3 Po e^ rpr vle au Swf v r i n es o 6 Wt ih d 480 Hgt eh i : 300 F r eae i nrt a :1 8 Fm c u t 1 5 r e on a awwww^ t wwww w 12.4. Вкладка Timeline в окне ActionScript Viewer 3. Рис.

Экспортирование библиотеки Чтобы экспортировать библиотеку, перейдите в ASV на вкладку Library (рис. 12.5), щелкните правой кнопкой мыши (Windows) или щелкните с нажатой клавишей J§ (Mac) на любом символе и выберите в контекстном меню команду Save all Library Symbols as SWF. Символы SWF импортируются в Flash командой File • Import • Import to Library. После импортирования символам следует присвоить осмысленные имена и вручную определить для них идентификаторы компоновки (которые не экспортируются из ASV, хотя и отображаются в квадратных скобках на вкладке ASV Library рядом с каждым именем символа).

Глава 12. Безопасность \Щ zJiffife JLF Mil] Ue ss Ctrl+й MMJM F e Lrr ;

lt n e n e ] Fm Lb? j ao cp | s ea Tg ] a s b y ^a c a s r e ae dmnh p cl as im i a ma li i г Wra - - Й 1 fa e rms ^ e Й Symbol 48 MovieClip T S b 4 Tt y o6 e ml n T S b 4 Tt yo7 e ml x 4 Щ Open in Slew Window Special Open in New Window \ Trace in Timdine j Save as Swf Hex View Shift+Ctrl +N 0 3... \ Timetin T | Symbol 49 E ditableTj (\ Trace in Frames TaglD DefineShape (2) Data Size 50 bytes Defined in frame 5 Shape record c... G ;

;

.„.. !*• Рис. 12.5. Вкладка Library в окне ActionScript Viewer 3. Итоги Хотя для больших или сложных SWF процесс декомпиляции занимает много времени, это все равно быстрее, чем начинать нуля. Вам удастся восстановить из SWF два самых важных ресурса: ActionScript и символы библиотеки. Даже если ничего больше извлечь не удастся, все равно достигается существенная экономия времени. Также декомпиляция SWF применяется для определения точной структуры SWF и проверки оптимальности размера файла. Более того, декомпиляция поможет лучше понять общие принципы работы контента Flash и осознать, какие именно данные использует Flash Player. Конечно, декомпиляция также позволяет красть ваш контент или (что более вероятно) тайком заимствовать творческие идеи. Открытие SWF в декомпиляторе или редакторе кода (таком, как URL Action Editor - http://buraks.com/uae) дает злоумышленнику еще больше шансов для похищения вашей работы, чем при использовании обычных технологий HTML: • Flash SWF содержат большую часть контента вашего сайта в минимальном количестве файлов, а это упрощает поиски;

• создание мультимедийных ресурсов обычно обходится дороже, чем создание статических веб-страниц. Для создания аудио/видео, графики и сценариев, содержащихся в вашем Flash-творении, необходимы более богатые способности, чем для создания HTML-страниц, состоящих из простой графики и текста;

Защита и шифрование файлов Flash • Flash-сайты обычно предоставляют больше возможностей для настройки, чем стандартные HTML-страницы. Немного изменив код, содержащийся в SWF, похититель контента может быстро изменить внешний вид краденого сайта. Я видел немало подозрительных сайтов, которые выглядели так, словно дизайнер просто скопировал символы и сценарии из двух или трех хорошо известных Flash-сайтов, а затем объединил их для создания чего-то «нового»!

Наличие инструментария и возможностей для декомпиляции SWF-файлов часто ставит дизайнера перед моральным выбором. Если разработчик не выложил FLA-файлы для открытого доступа, скорее всего, он не захочет, чтобы вы декомпилировали его код, хотя для чисто исследовательских целей это может оказаться не запрещено. Если вы знакомитесь с работой других разработчиков в поисках вдохновения (как во многих трюках этой книги!), достаточно воспроизвести SWF в Flash Player. Воспроизведите исходную работу вместо того, чтобы присвоить чужой труд без разрешения автора. Помните: если клиент присылает вам SWF-файлы и говорит, что ему не удалось получить FLA от разработчика, вы вправе запросить дополнительную информацию. Возможно, в контракте разработчика было сказано, что исходные файлы FLA не входят в поставку. Присвоение труда исходного разработчика может кончиться судебным иском за нарушение авторских прав. Как минимум, постарайтесь убедиться в том, что клиент обладает правами на FLA-файлы, особенно если он не располагает их копиями. Также проследите за тем, чтобы в контракте на разработку вся ответственность за нарушения авторских прав в передаваемых материалах была возложена на заказчика.

ТРЮК Защита и ш ф о а и ф й о Flash и рвне а лв Если кражу или декомпиляцию Flash-контента нельзя предотвратить полностью, ее можно по крайней мере затруднить.

№ К сожалению, дизайн сайта, в который разработчик вложил столько труда, не защищен от кражи (см. трюк 97). Например, URL Action Editor (http://buraks.com/ uae) позволяет изменить аргументы любых операций с URL, используемых в SWF. Злоумышленник может взять SWF-файл, загружающий ваш контент, и переработать его так, чтобы он загружал его контент - или, что еще хуже, выдать за собственную разработку. Известен по крайней мере один доказанный случай, когда известный дизайнер декомпилировал код другого известного дизайнера и выдал его за свой собственный (совет вору: в следующий раз изменяйте имена переменных!).

Защита S F W Среда разработки Flash позволяет любому желающему загрузить незащищенный SWF-файл. Вообще говоря, SWF можно защитить от импортирования в Flash, установив флажок Protect from Import (File • Publish Settings • Flash). Тем не менее, файл может быть открыт в другом приложении (например, в текстовом редакторе), Глава 12. Безопасность а программы-декомпиляторы типа ActionScript Viewer (http://buraks.com/asv) могут сбросить флаг защиты и сделать возможным импортирование в Flash. Сжатие SWF (File • Publish Settings • Flash • Compress Movie) помогает скрыть работу от посторонних, поскольку сжатые данные труднее декодировать, чем обычный формат SWF. Технологическая защита никогда не бывает абсолютной. Умный взломщик способен вскрыть любую схему, если у него будет достаточно времени. Следовательно, мы должны поставить на его пути столько препятствий (каждое из которых запутает решение и потребует лишнего времени), чтобы злоумышленник просто отказался от своей затеи. В играх и коммерческих приложениях часто используются схемы защиты, которые считаются неуязвимыми, но, похоже, это лишь разжигает азарт взломщиков. С другой стороны, браузерный модуль Flash Player в конечном счете должен отображать контент SWF. Следовательно, опубликованные SWF окажутся на компьютере пользователя в незашифрованном виде, даже если они были получены с защищенного сервера HTTPS. Даже если бы браузеры поддерживали воспроизведение шифрованных данных, изобретательный взломщик мог бы перехватить графику, передаваемую видеоадаптеру, или аудиопоток, передаваемый на звуковую карту. Итак, первый прием - маскировка. Мы постараемся отбить у хакера желание заниматься взломом или продлить его работу, скрывая схему защиты, вместо использования очевидного механизма, претендующего на стопроцентную надежность.

Маскировка типов файлов Все файлы нашего сайта в конечном счете окажутся в кэше браузера на компьютере взломщика. Если хакеру потребуется найти SWF- или МРЗ-файл, ему достаточно провести поиск файла с нужным именем. Чтобы затруднить взлом даже на этом начальном этапе, измените расширения и имена критических файлов. Для примера возьмем загрузку ресурсного файла МРЗ во время выполнения программы: my_sound = new Sound(this);

my_sound.loadSound ("song.mp3". true);

Допустим, мы пишем музыкальный проигрыватель на базе Flash для студии звукозаписи. Чтобы хакер не мог найти файл МРЗ и сразу выложить его в каталог обмена файлами Napster/WinMX, просто задайте файлу какое-нибудь невразумительное имя (например, top_header_02.gif) и приведите код к следующему виду: my_sound = new Sound(this): my_sound.loadSound ("top_header_02.gif". true): Flash игнорирует расширения при загрузке внешних файлов (предполагается, что загружается именно звуковой файл независимо от имени и расширения, переданных методу Sound.loadSound()). Если операционная система взломщика не проверяет соответствие между содержимым файла и его расширением (а последним из моих компьютеров, поддерживавших такую возможность, был Commodore Amiga!), на определение истинного типа файла потребуется время.

Защита и шифрование файлов Flash Вероятно, читатели с опытом традиционного веб-дизайна уже ухмыляются, осознав'всю гнусность этого трюка, но на всякий случай я объясню подробнее. Просматривая содержимое кэша браузера, хакер видит файл top_header_02.gif. Дальше происходит следующее: • вполне вероятно, что он даже не станет заглядывать в этот файл, потому что его имя подразумевает банальный срез GIF для таблицы HTML;

• если он все же решит открыть файл, программа просмотра GIF сообщит, что содержимое файла испорчено. На этой стадии многие отказываются от дальнейших разбирательств. Если хакер начнет просматривать доменные и временные характеристики каждого файла в кэше или сохранит всю веб-страницу вместе с внедренными материалами (в IE это делается командой Файл • Сохранить как (File • Save As)), он может заподозрить, что дело неладно. Но даже после того как трюк будет раскрыт, злоумышленник не сразу поймет, что под псевдо-GIF-файлом спрятан замаскированный МРЗ-файл. Смена расширения собьет с толку хакера и его операционную систему. Чтобы найти контент для похищения, ему придется открывать каждый файл на сайте или декомпилировать SWF и искать команды loadSound(). Если вы не стесняетесь в средствах, воспользуйтесь трюком «с темной стороны» превратите маскируемые файлы в файлы системных типов, которые при двойном щелчке могут нарушить работу операционной системы хакера. Система Windows обычно предупреждает пользователей, изучающих содержимое кэша браузера, что двойной щелчок на файле может привести к печальным последствиям, поэтому можно считать, что ваша жертва была честно предупреждена. Естественно, некоторые приемы не работают в Mac OS, но смена расширения файла запутает хакеров, работающих на обеих платформах. ПРИМЕЧАНИЕ При использовании этого трюка храните информацию о настоящем типе каждого файла. Храните «фальшивые» файлы для размещения на сайте отдельно от файлов, задействованных в разработке. Не забудьте выработать политику архивирования, потому что однажды защита может обернуться против вас, если вам потребуется декомпилировать SWF.

Итоги Нет ничего плохого в том, что кто-то будет черпать вдохновение в вашей работе. Даже если вас это не устраивает, у вас нет никаких юридических и практических средств помешать этому. Вы можете запатентовать свое выражение идеи, но не саму идею. Большинство идей имеет слишком общий характер, чтобы стать объектном патентной защиты, а оформление патента требует слишком больших затрат времени и средств. Наконец, во многих случаях даже патент не обеспечит реальной защиты. Малоизвестная разновидность патентов (так называемые дизайнерские патенты) защищают дизайнерские решения - скажем, форму и полупрозрачность корпуса исходного варианта iMacs. Но даже юридический отдел Apple не смог помешать производителям PC имитировать дизайн продукта.

Глава 12. Безопасность Теоретически, контент пользуется юридической защитой с момента его перевода в материальную форму, и вы можете зарегистрировать свое авторское право ради дополнительной прибыли;

но обеспечить соблюдение авторских прав в такой международной среде, как Веб, практически невозможно. К тому же в большинстве случаев злоупотребления Flash-дизайном отсутствует доказанный экономический ущерб от нарушения авторских прав, поэтому не стоит кричать: «Караул, грабят!» - и надеяться на возмещение убытков. Более правильный путь - технологический с небольшой долей социотехники. Если хакер хочет сэкономить время за счет использования ваших ресурсов, затрудните кражу контента до такой степени, чтобы она стала экономически невыгодной.

ТРЮК Привязка к сайту Защитите свой контент так, чтобы он отображался только на вашем сайте, — привяжите его к конкретному местоположению.

№ Если хакер найдет ваш SWF-файл (см. трюк 98), то перед декомпиляцией (см. трюк 97) он наверняка попытается запустить его на локальном компьютере и посмотрит, что при этом произойдет. Запрет на загрузку контента из других доменов в Flash Player всего лишь заставит хакера изменить все URL в SWFфайле (а это и так первое, что он сделает в процессе переработки вашего сайта). Если запуск SWF будет возможен только из конкретного места (то есть с вашего сервера), хакеру по крайней мере придется потратить время на взлом защиты. Свойство MovieClip._url сообщает SWF-ролику, откуда он был запущен. По его значению программа может узнать, был ли ролик запущен из положенного места, то есть из вашего домена, или же он запускается локально (Это может свидетельствовать о том, что кто-то пытается полностью или частично модифицировать SWF). Так, после выполнения команды var myLocation = this._ur1: в переменной myLocation хранится URL, если SWF запускается из Веб (например, http://www.futuremedia.org.uk/test/test.swf), или локальный путь к файлу в случае локального запуска (например, file://C:\Documents and Settings\Sham B\Desktop\ test.swf). Если содержимое myLocation отличается от предполагаемого, выполняются соответствующие защитные действия.

С о при загрузке S F бй W При обнаружении цикла, выполняющего большое количество итераций в течение более 15 с, Flash Player прерывает выполнения сценария (или выдает предупреждение и предлагает завершение при тестировании ролика в среде разработки Flash). Следующий фрагмент переводит SWF в бесконечный цикл при запуске из другого места: myLocation = this._url;

i f (myLocation != "http://www.futuremedia.org.uk/test/test.swf") { do { Привязка к сайту // Бесконечный цикл } while (true);

} При такой защите хакеру будет труднее разобраться в том, что делает SWF. Чтобы происходящее стало еще более непонятным, добавьте длинные задержки, при которых диалоговое окно с предупреждением не выдается, но создастся иллюзия «зависания» SWF. В следующем листинге функция задержки будет выполняться каждую миллисекунду: myLocation = this._url: i f (myLocation != "http://www.futuremedia.org.uk/test/test.swf") { II Вызывать функцию задержки каждую миллисекунду setlnterval (delayMe. 1);

} function delayMeО { / Выполнить 10 000 итераций просто д я замедления р б т Player / л аоы f r ( a i = 0;

i < 10000: i++) { o vr x = Math.randomO;

Переход на другой сайт Если SWF выполняется из недопустимого места, также можно воспользоваться функцией getURL() для перехода на домашний сайт. Заметив это, хакер, вероятно, поймет, что переход осуществляется функцией getURL(), и начнет искать строку URL в какой-нибудь специализированной программе вроде-URL Action Editor (http://buraks.com/uae). Впрочем, на это понадобится время. Чтобы затруднить работу хакера, напишите код так, чтобы переход происходил только в отдельных случаях по принципу: «Если SWF запускается из незнакомого места и сегодня четверг, перейди на домашний сайт функцией getURL()». Хакер будет считать, что его злодеяние прошло успешно... пока не наступит четверг. Для пущего эффекта можно перейти на какой-нибудь порнографический сайт, чтобы вору пришлось объясняться с заказчиком. В следующей программе переход по адресу http://www.futuremedia.org.uk/test/test.swf (нет, это не порнографический сайт!) выполняется в случае, если текущий SWF находится не на этом сайте, а текущим днем недели является четверг (4 - код четверга в возвращаемых значениях метода Date.getDayO). Обратите внимание на малопонятные имена переменных. В идеальном случае переменные р, q, r и s должны определяться в другом месте, чтобы происходящее стало еще туманнее: var p:String = this._url;

var q:String = "http://www.futuremedia.org.uk/test/test.swf";

var г-.Date = new DateO;

var s:Number = 4: i f (r.getDayO == s) { i f (p != q) { getURL(q):

44В Глава 12. Безопасность Перекрестная защита Хакеру гораздо проще работать с одним файлом, чем разбираться с сайтом, разделенным на несколько SWF, - особенно если вы также присвоите фиктивные имена некоторым из SWF (см. трюк 98) и привяжете их к конкретному серверу. Также попробуйте разместить код защиты в другом SWF, отличном от защищаемого (я называю это перекрестной защитой). Например, включите следующий код в SWF, загружаемый главным SWF: myLocation = levelO._url;

i f (myLocation != "http://www.futuremedia.org.uk/test/test.swf") { do { } while (true): } Попробуйте разместить логику защиты в постороннем SWF, не представляющем интереса для хакера. Например, включите ее в SWF-файл с контентом вместо основного SWF-файла с фирменным пользовательским интерфейсом, чтобы защиту было труднее найти. Запускайте код защиты по интервальному таймеру, установленному функцией setlntervalQ (вместо того чтобы запускать его сразу же после загрузки SWF). Хакеру будет труднее найти этот код, потому что он не сразу поймет, какой из загруженных SWF содержит код защиты. Пример: function test О { clearlnterval(m);

var myLocation:String = JevelO._url;

i f (myLocation != "http://www.futuremedia.org.uk/test/test.swf") { do { } while (true): var m:Number = setlnterval(test. 30000): Схема защиты обычно реализуется на последней стадии цикла разработки, чтобы программист мог спокойно работать над основным SWF без хлопот с защитой.

Итоги Сразу же после появления декомпиляторов SWF появился целый поток сайтовдвойников и примеров FLA, подозрительно напоминавших ранее не публиковавшийся код. Примите необходимые меры, чтобы ваша работа не попала в посторонние руки! Разработчики Flash часто спрашивают, как защититься от клиентов, которые «забывают» заплатить после получения всех материалов по контракту. Один из стандартных способов - удержание исходных FLA-файлов до получения оплаты (клиент получает SWF для размещения на сайте, но и разработчик получает частичную страховку). Обычный трюк с проверкой местоположения в таких ситуациях не применим, потому что SWF будет запускаться с клиентского сайта, но вы можете разместить XML-файл на удаленном сервере, находящемся иод Просмотр откомпилированного кода ActionScript вашим контролем. Flash-ролик (на сервере клиента) проверяет удаленный XMLфайл при каждой инициализации. Это дает возможность разработчику «отключить» приложение сбросом флага в XML-файле, если клиент не заплатит в срок. Тем не менее, такие схемы проверки могут противоречить контракту на разработку, а в случае их нарушения у вас могут быть крупные неприятности. Например, если SWF не сможет получить доступ к удаленному серверу с XML-файлом из-за обычного сбоя на сервере, сделайте так, чтобы SWF по умолчанию работал без файла. Применяйте подобные «бомбы замедленного действия» крайне осторожны, и обязательно передайте «чистую» версию SWF и/или FLA сразу же после того, как клиент с вами рассчитается.

Просмотр откомпилированного кода №100 ActionScript ТРЮК Анализ откомпилированного кода способствует низкоуровневой оптимизации и разработке общего стиля кодирования, направленного на оптимизацию. Декомпилятор SWF восстанавливает исходный код ActionScript (см. трюк 97) на основании байт-кода в SWF. Декомпиляторы SWF помогают восстановить (или украсть!) исходный код ActionScript, но в некоторых ситуациях - например, при оптимизации кода по скорости или размеру - требуется просмотреть откомпилированный байт-код. Утилита Flasm, распространяемая с открытыми исходными текстами (http:// flasm.sourceforge.net), предназначена для просмотра байт-кода, полученного в результате компиляции ActionScript. Не путайте Flasm с декомпиляторами, это совершенно разные программы. Flash предназначается для настоящего эксперта ActionScript, желающего оптимизировать свой код. Кроме того, эта программа поможет узнать, как выглядит ваш код к тому моменту, когда он попадает в Flash Player. В документации Flasm достаточно подробно описан процесс обработки откомпилированного кода ActionScript виртуальной машиной Flash в Flash Player;

полагаю, читатель найдет этот материал как интересным, так и поучительным. Последняя версия Flasm (версия 1.51) поддерживает формат Flash MX 2004. Полезно сравнить методику оптимизации кода Flash Player 7 по сравнению с Flash Player 6 (если, конечно, этот код работает быстрее предыдущей версии) - это поможет вам писать хорошо оптимизируемый код. Flasm - не экзотическая диковинка для хакеров, а действительно полезный инструмент. Flasm Flasm (FLash ASseMbler) - бесплатный компилятор и декомпилятор SWF. Его исходная версия была написана Дэйвом Хейденом (Dave Hayden) (http://www.opaque.net) и Дэмианом Мортоном (Damian Morton), а в настоящее время разработку и сопровождение ведет Игорь Коган (Igor Kogan).

Глава 12. Безопасность Flasm работает в режиме командной строки, поэтому вам придется либо использовать режим командной строки (Windows), либо открыть окно терминала (Мае). Шариф Айна (Shariff Aina) написал пользовательский интерфейс для Windows, который называется WinFlasm;

его текущий URL можно найти в документации Flasm или на сайте http://flasm.sourceforge.net. Для простоты мы будем использовать его в данном трюке. Чтобы установить Flasm, загрузите ZIP-файл и распакуйте его в каталог по своему выбору. WinFlasm распаковывается из архива в один каталог с Flasm. К сожалению, пользователям Мае придется работать в режиме командной строки. Документация Flasm содержит более подробные инструкции об интеграции Flasm в среду разработки Flash. Эта информация пригодится разработчикам, интересующимся созданием высокооптимизированного кода. После компиляции SWF-файла в среде разработки Flash запустите WinFlasm и откройте SWF-файл для просмотра Командой Open. Выберите операцию при помощи переключателей на нижней панели (рис. 12.6).

O e About pn S F File |c,«ve01.swf W ;

;

:: :;

Г;

:

-и;

-;

ШЙаШЬе SWF;

replaeella|m;

roacros ;

§ • ;

!

j Execute.;

: • Grig.;

filesize =- 2 Bytes :5 Рис. 12.6. Интерфейс WinFlasm Я обычно выбираю операцию декомпиляции с прямым редактированием (Decompile and Edit Directly), которая, несмотря на свое название, отображает откомпилированный SWF. Щелкните на кнопке Execute, чтобы открыть откомпилированный SWF-ролик в WordPad (рис. 12.7).

Просмотр откомпилированного кода ActionScript' scess eMnbr push riS, " п. 1 а е сеез' function2 ( (ril^'this1) ) push 0.0, r:this, 'stcpDrag' callMethod pop pasis r:tfcis, ' oisHouaeMove • delete pop end // of function scese eMnbr push r 2 : return end // of function drawPip functicn2 drawCurve (r:3='pointi', r:2»'point2', r:4=•curvePoinc' push 0 0 r:thia, 'clear*.> callMethod pep push 102, 14530253, 1, 3, r:chia, 'lineStyle' clKtcd alefo pep push r:poi nt1, " у' gecMensber push rrpointl, "jt1 geeMeraber push 2, r:this, 'rooveTo' cellMethod ii ж Рис.

12.7. Откомпилированный файл ActionScript в WordPad Работа с откомпилированным кодом Листинг откомпилированного кода - самый надежный источник информации об итоговом коде, используемом Flash Player на стадии выполнения. Код Action Script в документе FLA преобразуется в поток байтов, называемый байт-кодом. Преобразование уменьшает объем программного кода за счет замены методов более короткими лексемами, а также раскладывает сложные операции на более простые, понятные для Flash Player. Любой программист с опытом программирования на ассемблере заметит, что внутренняя архитектура виртуальной машины Flash Player сильно напоминает архитектуру старых 8-разрядных процессоров. Она включает стек, в который обрабатываемые значения (используемые при сложении, вычитании и т. д.) заносятся перед обработкой, с последующим извлечением результата из стека. Таким образом, Flash Player использует стековые операции вместо обращений к абсолютным адресам памяти. Промежуточные значения хранятся в регистрах.

Глава 12. Безопасность Использование регистровых данных существенно ускоряет сложные или итеративные вычисления.

Работа с Flasm Рассмотрим пример использования Flasm для получения эффективного кода с модульной структурой. Однажды мне захотелось узнать, как применение функций отражается на общем быстродействии. Хотя вызовы функций улучшают структуру программы, у меня были некоторые сомнения относительно целесообразности их применения в участках кода, критических по быстродействию, - здравый смысл подсказывал, что вызов функции сам по себе требует дополнительного времени. Так или иначе, я решил, что эту тему стоит поподробнее исследовать в Flasm. Возьмем фрагмент кода без вызова функций: var х = 5: var у = 6: var z = х*у;

trace(z);

Flasm выдает следующий байт-код Flash Player 7: f a e0 rm c n t n s ' ' ' ' 'z' osat x, у, p s 'x', 5 uh vrqas aEul ps '' 6 uh y. vrqas aEul p s 'z', ' ' uh x getVariable push 'y' getVariable mlil utpy vrqas aEul p s 'z' uh getVariable trace end //of frame При использовании системы типизации ActionScript 2.0: var x:Number = 5;

var у:Number = 6: var z:Number = x*y;

trace(z): результат был бы точно таким же. Из этого можно сделать вывод, что типизация не приводит к снижению быстродействия или увеличению размера файла (и это вполне логично, поскольку проверка типов осуществляется на стадии компиляции, а не во время выполнения). На моем компьютере обе версии, типизированная и нетипизированная, выполнялись примерно в течение 0,06 мс (без команды trace(), поскольку операции вывода обычно выполняются довольно медленно).

Просмотр откомпилированного кода ActionScript • Хронометраж осуществлялся кодом следующего вида (мы проводим 1000 итераций для получения средней скорости):

// Измерение продолжительности самого цикла startTime = getTimerO;

for (var i = 0;

i < 1000;

i++) {} endTime = getTimerO;

measureTime = endTime - startTime;

/ И м р н е поожтлнси цка с потмкдм / з е е и рдлиеьот ил рсы оо s a t i e = getTimerO;

trTm f r ( a i = 0 i < 1 0 ;

1++) { o vr ;

00 / Т с и у м й кд / етреы о } endTime = getTimerO: codeTime = endTime - startTime - measureTime;

trace(codeTime/1000):

В следующей версии та же операция выполняется с использованием функции: function multiplyO { return x * у;

} var x:Number ='5;

var у.-Number = 6;

var z:Number = m u l t i p l y O ;

trace(z);

Далее следует байт-код, выданный Flasm. Как и ожидалось, код увеличился в объеме, а его выполнение занимает больше времени (0,16 мс - почти вдвое больше, чем в версии без применения функций). Нехорошо получается.

frame О constants ' х ', ' у ', ' z '. 'multiply' function multiplyO push 'x' getVariable push 'y' getVariable multiply return end // of function multiply push ' x '. 5 varEquals push ' у '. б varEquals push ' z '. 0.0. 'multiply' call Function varEquals push 'z' getVariable trace end // of frame- Глава 12. Безопасность Затем я попытался вызвать функцию с аргументами, полагая, что в этом случае будет сгенерирован самый длинный байт-код: function multiply(a. b) { return a * b: } var x:Number = 5;

var у:Number =6;

var z:Number = multiply(x. y);

trace(z);

Но оказалось, что новая версия работает гораздо быстрее старой! (0,12 мс)! Анализ байт-кода поможет понять, почему это происходит. При вызове функции с аргументами сгенерированный байт-код обращается к данным напрямую, вместо того чтобы обращаться к переменным с их значениями. Это приводит к уменьшению объема байт-кода и ускорению выполнения. frame О constants 'x'. 'у', 'i'. 'multiply' function multiply(r:2='a'. r : T = 'b') О push г:а. г:Ь multiply return end / / o f function multiply push 'x'. 5 varEquals push 'y'. 6 varEquals push 'z'. 'y' getVariable push 'x'. 5 getVariable push 2. 'multiply' call Function push 'z' getVariable trace end / / o f frame 0 Если в программе применяется функция с аргументами, Flash Player использует более эффективные прямые обращения к регистрам вместо ячеек памяти (содержимое которых перед использованием все равно приходится заносить в регистры или в стек). Это весьма интересное открытие наводит на мысль, что Macromedia развивает ActionScript в направлении более структурированного стиля программирования, для которого характерны функции, ссылки и параметры, а не отдельные переменные. Эксперименты показывают, что время вызова функции компенсируется увеличением объема кода в каждой функции;

написание логичного, модульного кода способствует повышению быстродействия во многих приложениях. Итак, оптимизации Flash Player 7, о которых говорит Macromedia, в наибольшей степени проявляются при использовании объектно-ориентированного стиля программирования, элементы которого появились в ActionScript 2.O.

Просмотр откомпилированного кода ActionScript Если попробовать повторить эти примеры в Flash Player 6 (Flash MX), результат будет иным. Исключение составляет разве что Flash Player 6r65 (флажок Optimize for Flash Player 6r65 на вкладке File • Publish Settings • Flash), который ведет себя почти так же, как Flash Player 7 (наверное, потому что он, фактически, представляет собой Flash Player 7 без новых классов ActionScript, добавленных в Flash MX 2004). При просмотре в Flasm кода старых версий Flash Player становится очевидно, что оптимизации Flash Player 7 и Flash Player 6r65 связаны в основном с эффективным использованием регистров и стека. Но чтобы извлечь пользу из этих оптимизаций, необходимо активно применять такие возможности, как передача аргументов функциям, объявление локальных переменных и передача целевого объекта в аргументе вместо обращения к нему через свойство this. Также стоит провести серию тестов для выявления различий между объявлениями классов ActionScript 2.0 и наследованием на базе прототипов в ActionScript 1.0. Небольшая подсказка: жесткая типизация ActionScript 2.0 реализуется на стадии компиляции и не влияет на быстродействие, а в ООП с применением классов используются четко определенные функции и локальные данные (что способствует оптимизацию байт-кода за счет использования регистров вместо памяти). Это означает, что для кода ActionScript 2.0, использующего классы, генерируется высокооптимизированный байт-код;

то же можно сказать о любом структурном стиле программирования, использующем функции и локализацию данных в функциях и аргументах.

Итоги Программа Flasm полезна прежде всего тем, что она показывает, во что превращается код ActionScript в итоговом SWF. На первый взгляд разобраться в листингах непросто, но вы довольно быстро освоите псевдоассемблер Flash Player, если начнете с коротких простых сценариев, как это было сделано в предыдущих примерах. Кроме того, Flasm помогает выявлять узкие места ActionScript. Учтите, что в графических приложениях критическим для быстродействия фактором часто является механизм визуализации (см. трюк 68), а не байт-код. Конечно, столь краткое описание дает крайне поверхностное представление о Flasm и оптимизации кода. Если вы принадлежите к числу опытных программистов ActionScript, с Flasm определенно стоит познакомиться поближе - полученная вами бесценная информация о среде Flash Player поможет выжать еще немного быстродействия из ваших SWF.

Pages:     | 1 |   ...   | 5 | 6 || 8 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.