2012-01-13 7 views
1

Я работаю над крупным проектом Flash, который станет основным содержанием сайта.Как привязать SWF к узлу?

Как известно, почти любой сайт может быть полностью скопирован путем копирования кешированных файлов и иерархии (структура файлов и папок), и он будет работать без проблем на сервере Apache с включенным PHP, если он используется.

Что я хотел бы знать: Как связать файлы SWF для работы на определенном хосте?

SWF будут зашифрованы, поэтому аутсайдеры не будут иметь доступа к методам, которые используются для остановки работы SWF на другом хосте, вопрос: какой метод использовать?

Я думаю, что решение может быть жестко кодировать IP-адрес хоста внутри SWF, поэтому, если SWF ищет 123.123.123.123, только хост с этим IP-адресом позволит SWF работать дальше.

Проблема в том, что AS3 самостоятельно не может обнаружить IP-адрес хоста или может быть, если он пытается загрузить файл ресурсов? Во всяком случае, вот почему мне нужна ваша помощь.

EDIT: Хорошо, кажется, кто-то спросил что-то подобное раньше: Can you secure your swf so it checks if it is running on a recognized environment? Я постараюсь, что и посмотреть, как это работает, но вопрос остается открытым в случае, если кто имеет различные предложения.

+0

'почти любой сайт может быть полностью скопирован путем копирования кэшированных файлов и иерархии (структура файлов и папок)' - не совсем верно. Вы не получите ни одного из кода на стороне сервера, который генерирует контент, а только кешированный контент, который Таким образом, наличие «сервера Apache с включенным PHP» не имеет значения, потому что вы не получите никакого кода PHP, просто HTML/css/js/etc. Все, что вам нужно для выполнения этой довольно бесполезной задачи, - это любой веб-сервер. – DaveRandom

+0

Да, вы правы. PHP как кешированный ресурс, который можно скопировать, не очень хороший пример, но доступ к файлам CSS, JS и XML необходимые для правильного отображения веб-сайта, кэшируются и могут быть легко скопированы для воспроизведения сайта на любом хосте, и я знаю, что не могу этого предотвратить, поэтому я ищу способ сделать SWF защищенным, если только нет другой доступный метод, который нельзя обойти, просто копируя кешированные ресурсы. – IneedHelp

ответ

2

Я использую этот метод, чтобы определить, есть ли я на dev или production в моих конфигурационных файлах.

var lc:LocalConnection = new LocalConnection(); 
switch (lc.domain){ 
    case "myDomain.com": 
    case "":// local file reference for dev 
    case "localhost":// local file reference for dev 
    case "dev.mydomain.com":// local file reference for dev 
    break; 
    default: 
    // unknown domain do crash the app here 
} 
+0

Отлично! Я тестировал это, и он говорит localhost в моей системе, но дает имя субдомена при тестировании сайта на субдомене, зарезервированном для разработки, без необходимости вызова внешних интерфейсов. Спасибо! – IneedHelp

+0

Чистое, простое решение. Мне это нравится. –

1

Один из методов, которые вы могли бы попробовать - это php-скрипт, который swf отправляет запрос и должен получить правильный ответ до того, как он продолжит работу. Поскольку люди не могут получить ваш серверный php, они не смогут получить необходимый код для имитации этого ответа.

+0

Как я мог это сделать? Должен ли я создать отдельный PHP-файл, содержащий метод, который возвращает ожидаемый ответ при вызове SWF? Не могли бы вы привести пример или какой-нибудь образец кода, чтобы я мог лучше понять? Спасибо! (+1) – IneedHelp

+0

Я бы с удовольствием, но я никогда не делал ничего подобного. Я действительно хочу сделать что-то подобное в текущем проекте, но я только что начал проект пару часов назад и еще не получил эту часть. Кто-нибудь здесь отправил/получил данные между PHP-скриптом и AS3 раньше? –

0

В ФНБ будет зашифрован, поэтому посторонние не будут иметь доступ к методам, используемым, чтобы остановить SWF от запуска на другом хосте Поскольку файл будет работать на клиентском компьютере (и, таким образом, они ключ будет иметь для хранения в доступном виде), на самом деле это не такая уж большая часть защиты.

Лучший способ, вероятно, состоит в том, чтобы иметь часть SWF-логики на сервере и не предоставлять доступ к этой части с сторонних хостов (используя файл crossdomain).

+0

Извините, я немного замедлился - не уверен, что полностью понимаю, как это работает. В настоящее время мой каскадный SWF-проект сконструирован так: маленький SWF-файл сначала загружается и отображается на индексной странице, а затем SWF загружает другой SWF (который является основным предварительным загрузчиком), а затем SWF загружает несколько других SWF-файлов. Как любой из этих SWF-запросов запрашивает ресурсы без их кэширования браузером клиента, используя файл crossdomain.xml? – IneedHelp

+0

Это не совсем то, что я имел в виду - если бы это была игра, например, она могла бы выполнять часть логики игры на сервере и запрещать доступ к этой службе с помощью файла crossdomain. –

0

Загляните в идею обертывания основной части типа preloader и помещения основного в безопасный каталог на сервере. Я не могу вспомнить, как это происходит вокруг проблемы с кешем, но это связано с тем, как обертка загружается главным образом.

Что-то вроде этого:

// preloader.as (embedded in fla) 
var imageLoader:Loader; 

function randomNumber(low:Number=NaN, high:Number=NaN):Number 
{ 
    var low:Number = low; 
    var high:Number = high; 

    if(isNaN(low)) 
    { 
    throw new Error("low must be defined"); 
    } 
    if(isNaN(high)) 
    { 
    throw new Error("high must be defined"); 
    } 

    return Math.round(Math.random() * (high - low)) + low; 
} 
function loadImage(url:String):void { 
imageArea.visible=false; 
preloader.visible = true; 
// Set properties on my Loader object 
imageLoader = new Loader(); 
imageLoader.load(new URLRequest(url)); 
imageLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imageLoading); 
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded); 
imageArea.addChild(imageLoader); 
} 
// DOIT! 
loadImage("main.sw?"+randomNumber(1000,10000)); //NOT A TYPO! 
//loadImage("main.swf"+randomNumber(1000,10000); 


function imageLoaded(e:Event):void { 
// Hide Preloader 
preloader.visible = false; 
} 

function imageLoading(e:ProgressEvent):void { 
// Get current download progress 
var loaded:Number = e.bytesLoaded/e.bytesTotal; 
// Send progress info to "preloader" movie clip 
preloader.SetProgress(loaded); 
} 

/// this is main.sw //NOT A TYPO 
<?php 
// Tried this - abandoned 
// session_start(); 
// 
// if(isset($_SESSION["flash"])) { 
// $referrer = $_SERVER["HTTP_REFERER"]; 
// $referrer = parse_url($referrer); 
// if($referrer["host"] != $_SESSION["flash"]) { 
//  echo "Permission denied."; 
//  exit(); 
// } 
// } else { 
// echo "Permission denied."; 
// exit(); 
// } 
// 
// unset($_SESSION["flash"]); 

header("Content-type: application/x-shockwave-flash"); 
readfile("/secure/main.swf"); 
?> 

// main.as 
public function onCreationComplete(event:Event):void{ 
    Security.allowDomain("*"); 
    Security.loadPolicyFile("crossdomain.xml"); 
} 

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

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

+0

Это просто заставит клиента получить файл с сервера, а не из кэша, но файл все равно будет кэшироваться. – IneedHelp

+0

Спасибо, вот что я понял. Это была первая попытка, сделанная давно, и мой пост состоял в том, чтобы составить дорожную карту некоторых точек входа, где ОП мог бы решить эту проблему. Таким образом, я играю в «старый код и забываю» здесь =) –

0

Вы можете иметь на стороне сервера страница сгенерировать ключ с использованием даты на основе алгоритма, который передается с помощью флэш-вар в ваш SWF. Таким образом, «скопированный» ключ не будет работать, потому что к тому времени действительная дата будет выполнена. Насколько я понимаю, это будет по существу похоже на использование маркера RSA.

Кроме того, любая защита, которую вы имеете, также нуждается в коде, чтобы быть внутри вашего SWF, чтобы проверить ваш токен. Проблема здесь в том, что SWF, как известно, декомпилируют довольно легко. Это означает, что ваш код небезопасен :(Вы можете запутать свой AS3 в надежде запутать любых «хакеров».

В общем, я никогда не пытался ничего подобного, поэтому дайте нам знать, как это происходит!

+0

Да, SWF можно легко декомпилировать, но есть коммерческое программное обеспечение для шифрования SWF, которые выполняют довольно хорошую работу при запутывании содержащегося кода (я не забочусь о защите медиа-ресурсов, они никогда не могут быть защищены). Могут быть способы перехвата того, что получает FlashPlayer, но это не соответствует вашему среднему пользователю декомпилятора. Что касается описанного вами метода, это может быть решением, если клиент не может перейти к алгоритму, но я не уверен в этом. В любом случае, я нахожу ответ The_asMan самым эффективным (чистым и легким) способом привязки SWF к хосту. – IneedHelp

Смежные вопросы