Как привязать SWF к хосту? - PullRequest
1 голос
/ 13 января 2012

Я работаю над крупным Flash-проектом, который станет основным содержанием сайта.

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

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

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

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

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

РЕДАКТИРОВАТЬ: Хорошо, кажется, кто-то просил что-то подобное ранее: Можете ли вы защитить свой swf, чтобы он проверял, работает ли он в признанной среде? Я попробую это и посмотрю, как это работает, но вопрос все еще остается открытым, если у кого-то есть другие предложения.

Ответы [ 5 ]

2 голосов
/ 14 января 2012

Я использую этот метод, чтобы определить, нахожусь ли я на 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
}
1 голос
/ 13 января 2012

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

0 голосов
/ 14 января 2012

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

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

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

0 голосов
/ 14 января 2012

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

Примерно так:

// 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 голосов
/ 13 января 2012

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

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

...