如何将SWF绑定到主机?

时间:2012-01-13 17:17:55

标签: php actionscript-3 flash copy-protection

我正在开发一个主要的Flash项目,它将成为网站的核心内容。

正如大多数人所熟知的,几乎所有站点都可以通过复制缓存文件和层次结构(文件和文件夹结构)来完全复制,并且如果使用的话,它将在启用了PHP的Apache服务器上正常运行。 / p>

我想知道的是:如何绑定SWF文件以在特定主机上运行?

SWF将被加密,因此外人无法访问用于阻止SWF在其他主机上运行的方法,问题是:使用什么方法?

我认为解决方案可能是硬编码SWF中的主机IP,因此如果SWF正在寻找123.123.123.123,则只有具有该IP的主机才允许SWF进一步运行。

问题是单独的AS3无法发现主机IP,或者它是否正在尝试加载资源文件?无论如何,这就是我需要你帮助的原因。

编辑:好的,似乎有人问过类似的事情:Can you secure your swf so it checks if it is running on a recognized environment? 我会尝试并看看它是如何工作的,但问题仍然存在,以防万一有人提出不同的建议。

5 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

您可以尝试的一种方法是swf向其发送请求的php脚本,并且必须在继续操作之前收到正确的回复。由于人们无法访问您的服务器端php,因此无法获得所需的代码来模拟该回复。

答案 2 :(得分:0)

  

SWF将被加密,因此外人无法访问用于阻止SWF在其他主机上运行的方法   由于该文件将在客户端计算机上运行(因此它们的密钥必须以可访问的方式存储),这实际上并没有那么多的保护。

最好的方法可能是在服务器上部署SWF逻辑,而不是从第三方主机访问该部分(使用跨域文件)。

答案 3 :(得分:0)

研究将main包装在一种预加载器中的想法,并将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>

这应该让你开始。这里的想法是防止任何人在他们的机器上使用主机 - 我不确定它是否有用。

答案 4 :(得分:0)

您可能有一个服务器端页面使用基于日期的算法生成密钥,该算法通过flash var传递给您的swf。这样,“复制”密钥将不起作用,因为到那时,有效日期将过去。据我所知,这基本上就像使用RSA令牌一样。

除此之外,您拥有的任何安全性还需要代码才能在SWF中验证您的令牌。这里的问题是已知SWF很容易反编译。这意味着你的代码不安全:(你可能会混淆你的AS3,希望混淆任何“黑客”。

总而言之,我从来没有尝试过这样的事情,所以让我们知道它是怎么回事!