AS3防止跨站引用的解决办法
问题描述
以前在给游戏加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;