Flash 防止swf在不重新编译的情况下调用外部接口调用

Flash 防止swf在不重新编译的情况下调用外部接口调用,flash,actionscript-3,Flash,Actionscript 3,我正在使用第三方swf,我无法更改它,并负责使其在本地环境中工作,加载到我构建的容器应用程序中。SWF是为访问网络沙盒而发布的,因此每当它调用本地html容器中的ExternalInterface时,它都会抛出一个安全沙盒错误并终止执行。ExternalInterface调用都是非关键的(日志记录),因此如果我能以某种方式阻止它们,那么我就不会再有问题了 我很确定这是不可能的,但我希望这里的人能证明不是这样。我认为这是不可能的(或者至少这不是小事)。我曾经在AS 2.0项目中使用actionsc

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


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

我认为这是不可能的(或者至少这不是小事)。我曾经在AS 2.0项目中使用actionscript汇编程序/反汇编程序做过类似的事情(只是删除了几个调用)。但是这个工具只适用于AS2.0,我不知道还有其他类似的AS3.0工具(尽管可能存在)


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

我可能遗漏了一些东西,但外部接口主要用于调用SWF父级中的javascript

抛出的安全错误应该指示它试图调用的内容。在包装SWF的HTML中,您所要做的就是提供SWF试图调用的方法

因此SWF可能有
ExternalInterface.call(“js_函数”)等在包装器中

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

函数js_function(){//do nothing}

非常粗糙,但您可以在父应用程序中编辑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."); 
}

安全沙箱限制阻止内部swf调用javascript,不管函数是否存在,因为内部swf是为网络访问而不是本地文件系统访问而编译的。好,您可以使用Macromedia Flash Local Content Updater,它允许您更改SWF Quote Adobe的SWF安全设置:“当SWF文件在Flash Player 8及更高版本中作为本地文件播放时,此工具允许您更改SWF文件操作的安全沙盒。”请下载到此处。谢谢您提醒我此工具,虽然它没有解决我的问题。这似乎难以解决;Adobe对本地内容的安全性沙箱要求太高,所以我不得不寻求另一种选择。我会尝试一下,但Adobe在AS3中剥夺了原型的大部分功能。如果成功了,我会告诉你的。没有骰子。不幸的是,无法通过原型链重新定义AS3中的函数。