防止swf调用ExternalInterface调用而不重新编译它

时间:2011-04-16 02:03:38

标签: flash actionscript-3

我正在使用第三方swf,我无法更改,并负责让它在本地环境中工作,加载到我构建的容器应用程序中。发布SWF是为了访问网络沙箱,因此每当它在本地html容器中调用ExternalInterface时,它都会抛出安全沙箱错误并导致执行死亡。 ExternalInterface调用都是非关键的(日志记录),所以如果我能以某种方式阻止它们,那么我将不再有问题。

我很确定这是不可能的,但我希望这里有人可以证明不是。

3 个答案:

答案 0 :(得分:0)

我不认为这是可能的(或者至少它不是微不足道的)。我曾经使用FLASM,一个动作脚本汇编程序/反汇编程序在AS 2.0项目中做了类似的事情(只是删除了几个调用)。但是这个工具只适用于AS 2.0,我不知道AS 3.0的其他类似工具(虽然有些可能存在)。

但是,也许您可​​以设置一个本地Web服务器,这很简单(Windows上的WAMP,XAMP等)并将您的html运行为http://localhost/myApp/index.html,而不是直接从文件系统运行它。在这种情况下,这可能是一个简单的解决方法。

答案 1 :(得分:0)

我可能会遗漏一些内容,但外部接口主要用于在SWF的父级中调用javascript。

抛出的安全错误应该表明它试图调用的内容。在包装SWF的HTML中,您只需提供SWF尝试调用的方法。

所以SWF可能有ExternalInterface.call("js_function");,因此你的包装器中有

<script>
function js_function() { // do nothing }
</script>

答案 2 :(得分:0)

Hacky as hell,但你可以在你的父应用程序中编辑ExternalInterface类的.prototype,用你自己选择的函数替换“call”。我没有测试过这个,它只是一个理论,但它看起来像这样:

    // in your main application's wrapper, before you load in the .swf you're working with

    ExternalInterface.prototype.call = function(value:String):void { 
trace("You just tried to call a js function called '" + value + "', but I intercepted it."); 
}