Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash IE 9中的ExternalInterface.call漏洞_Flash_Internet Explorer_Memory Leaks_Externalinterface - Fatal编程技术网

Flash IE 9中的ExternalInterface.call漏洞

Flash IE 9中的ExternalInterface.call漏洞,flash,internet-explorer,memory-leaks,externalinterface,Flash,Internet Explorer,Memory Leaks,Externalinterface,我创建了一个非常简单的SWF来演示: package { import flash.display.MovieClip; import flash.events.Event; import flash.external.ExternalInterface; public class FlashIELeak extends MovieClip { public function FlashIELeak() { addEve

我创建了一个非常简单的SWF来演示:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.external.ExternalInterface;

    public class FlashIELeak extends MovieClip {

        public function FlashIELeak() {
            addEventListener(Event.ENTER_FRAME, onFrame);
        }

        private function onFrame(e:Event):void {
            ExternalInterface.call("test", null);
        }
    }
}
用Chrome加载,没有问题。内存或多或少是固定的

将其加载到IE中,内存就会不断增加,大约30k/s。您甚至不需要声明测试函数。只要在页面中嵌入swf,就有漏洞了。在我们的项目中,我们正在传递一个具有多个属性的对象,IE的泄漏速度大约为120k/s。不太好


有人见过这个吗?我找不到任何其他与此相关的帖子。

大约两年前,在著名的俄罗斯博客上有一篇帖子。亚历山大·科兹洛夫斯基(又名汽水)解释了这个问题。以下是他创建的解决方案:

package ru.kozlovskij.external
{
    import flash.external.ExternalInterface;
    /**
     * @author a.kozlovskij
     * @copy flash.external.ExternalInterface
     */
    public final class ExternalInterfaceExtended
    {
        private static const instance :ExternalInterfaceExtended= new ExternalInterfaceExtended();
        private static var methodName :String;

        /**
         * U can't instanciate this class, because it implements a Singletone pattern.
         * @copy flash.external.ExternalInterface.ExternalInterface()
         */
        public function ExternalInterfaceExtended()
        {
            instance && new ExternalInterface();
            methodName = '__flash__addCallback_' + ExternalInterface.objectID;
        }

        private static function updateJS():void
        {
            const jsFunc :String = 'function(){ ' +
                methodName + ' = __flash__addCallback = function(flashObj, methodName)' +
                '{' +
                '    alert("JS: called overridden __flash__addCallback(" + arguments[0] + ", " + arguments[1] + ")");' +
                '    flashObj[methodName] = ' +
                '     (function(methodName)' +
                '     {' +
                '     return function()' +
                '     {' +
                '     this.CallFunction(\'\' + __flash__argumentsToXML(arguments,  + \'\');' +
                '     };' + //dangling semi-colon for IE 6
                '     })(methodName);' + //force re-closure to prevent IE memory leaks
                '};' +
                '}';

            ExternalInterface.call(jsFunc);
        }

        /**
         * Fixed: Mem leaks in native addCallback-js-closure.
         * @copy flash.external.ExternalInterface.addCallback()
         */
        public static function addCallback(functionName :String, closure :Function):void
        {
            updateJS();
            ExternalInterface.addCallback(functionName, closure);
            //ExternalInterface.call(methodName, functionName);
            //ExternalInterface.call('__flash__addCallback_ext', null, functionName);
        }

        /**
         * @copy flash.external.ExternalInterface.call()
         */
        public static function call(functionName :String, ...parameters :Array):*
        {
            parameters.unshift(functionName);
            return ExternalInterface.call.apply(ExternalInterfaceExtended, parameters);
        }

        /**
         * @copy flash.external.ExternalInterface.available
         */
        public static function get available():Boolean
        {
            return ExternalInterface.available;
        }

        /**
         * @copy flash.external.ExternalInterface.objectID
         */
        public static function get objectID():String
        {
            return ExternalInterface.objectID;
        }

        /**
         * @copy flash.external.ExternalInterface.marshallExceptions
         */
        public static function get marshallExceptions():Boolean
        {
            return ExternalInterface.marshallExceptions;
        }

        public static function set marshallExceptions(value :Boolean):void
        {
            ExternalInterface.marshallExceptions = value;
        }
    }
}

所以,您只需要使用ExternalInterface扩展类而不是常规的ExternalInterface。

Nice!它最终会崩溃吗?如果你让它运行足够长的时间是的。我们有客户抱怨IE崩溃,我们将其缩小到这个问题。如果您不使用
ExternalInterface.call()
(在您的输入帧处理程序中),IE内存方面一切都好吗?您还可以指定在哪个版本的IE、Flash和Windows操作系统中发现此问题。最后,我会尝试把事情调低一点(输入帧事件发生得相当频繁)。如果将
ExternalInterface.call()
与一个触发的
计时器一起使用,比如说每10秒一次,会发生什么。我猜问题只是发生得比较慢…尝试每10秒发射一次,而不是使用设置间隔,但仍然会泄漏。它每10秒上升约6k。事实上,它并不一致。有时它会跳到80k左右,然后一分钟后又回到原来的状态。然而,随着时间的推移,它似乎确实在增加。但很难说,因为它太慢了。我让它运行一会儿,看看会发生什么。啊哇。谢谢你。我们最终使用了一种不同的方法,因此很遗憾,我无法对此进行测试。原始文章: