问题描述

以前在给游戏加sitelock时,都是使用 loaderInfo.loaderURL 或者 root.loaderInfo.url 的方式来获取swf的url,然后进行判断,虽然可以防止swf在别的域名下运行,但别的域名可以通过在页面中直接引用swf来在页面中进行显示。

解决方案

使用 ExternalInterface.call 来执行一段js代码,获取swf所在页面的url,如果swf的url和页面的url都处在同一个域,那么 ExternalInterface.call就可以正常获取页面的url,否则会返回空,从而结合之前的方法共同验证就可以保证swf文件既不会在别的域名下运行,也不会在别的域名下被引用运行。 代码如下:

private function checkDomain():Boolean
{
  var url:String = loaderInfo.loaderURL;
  var weburl:String;
  try 
  {
    weburl = ExternalInterface.call("function getUrl(){return window.location.href;}");
  }
  catch (e:Error)
  {
    weburl = "";
  }
  // 允许运行的域名列表,使用|分隔
  var allowedDomains:String = ".*junnan.org|.*dev.local";
  var allowedPattern:String = "^http(|s)://("+allowedDomains+")/";
  var domainCheck:RegExp = new RegExp(allowedPattern, "i");
  
  if (weburl != "")
  {
    if (!domainCheck.test(url) && !domainCheck.test(weburl))
    {
      showInfo();
      return false;
    }
  }
  else
  {
    showInfo();
    return false;
  }
  return true;
}

private function showInfo():void
{
  var textWarning:TextField = new TextField();
  textWarning.defaultTextFormat = new TextFormat("Tahoma", 24, 0x333333);
  textWarning.selectable = false;
  textWarning.multiline = true;
  textWarning.autoSize = "center";
  textWarning.x = 300;
  textWarning.y = 100;
  addChild(textWarning);
  
  textWarning.htmlText = '<p align="center"><br /><br />Please play this game at <a target="_blank" href="http://junnan.org"><font color="#CC0000">junnan.org</font></a>.</p>';
}

然后在preloader中所有动作的前面调用如下代码,即可生效:

if (!checkDomain())
  return;