Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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
Actionscript 3 怎么能不使用;“最后的”;这是安全问题吗?_Actionscript 3_Oop_Final - Fatal编程技术网

Actionscript 3 怎么能不使用;“最后的”;这是安全问题吗?

Actionscript 3 怎么能不使用;“最后的”;这是安全问题吗?,actionscript-3,oop,final,Actionscript 3,Oop,Final,摘自O'Reilly的Essential ActionScript 3.0(2007)第113页: 最终帮助隐藏类的内部详细信息的方法。上课 方法final防止其他程序员扩展类或重写 用于检查类的内部结构的方法。这种预防 被认为是保护应用程序不被删除的方法之一 恶意利用 这是指编译的、封闭源代码包的API的用户,以及“恶意利用”来了解类设计的情况吗?这真的是个问题吗 关于更多的上下文,这是使用final的两个原因中的第二个。在2007年版中,它在第113页的“继承”一章的副标题下,防止类被扩展和

摘自O'Reilly的Essential ActionScript 3.0(2007)第113页:

最终帮助隐藏类的内部详细信息的方法。上课 方法final防止其他程序员扩展类或重写 用于检查类的内部结构的方法。这种预防 被认为是保护应用程序不被删除的方法之一 恶意利用

这是指编译的、封闭源代码包的API的用户,以及“恶意利用”来了解类设计的情况吗?这真的是个问题吗

关于更多的上下文,这是使用
final
的两个原因中的第二个。在2007年版中,它在第113页的“继承”一章的副标题下,防止类被扩展和方法被重写

在ActionScript中使用最终属性有两个原因:

  • 在某些情况下,最终方法的执行速度比非最终方法快。如果你 如果您希望以各种可能的方式提高应用程序的性能,请尝试 使其方法最终化。但是,请注意,在未来的Flash运行时中,Adobe 期望非最终方法的执行速度与最终方法的执行速度一样快

  • 最终帮助隐藏类的内部详细信息的方法。上课 方法final防止其他程序员扩展类或重写 用于检查类的内部结构的方法。这种预防 被认为是保护应用程序不被删除的方法之一 恶意利用


在许多语言中,重写方法是从基类中选择加入的。通常,
virtual
关键字允许基类作者选择重写的可能性

然而,在AS3中,覆盖方法的能力是选择退出。这就是
final
关键字的作用。它允许基类作者说“此方法可能不会被重写”

有一些关于封装的老派观点认为,AS3这样做是一个安全问题。但这主要是在公共API中,您希望隐藏内容但公开功能

但是,在更现代的时代,我们已经了解到反汇编和反射将允许恶意开发人员以任何方式做任何他/她想做的事情,因此这在今天已经不是什么问题了。在我看来,依靠
final
来保证安全性是一根拐杖,任何关于它的建议都应该被驳回。安全问题需要更仔细地考虑。API的体系结构需要确保实现允许开发人员做需要做的事情,但安全关键信息不应包含在公共API中


这并不是说
final
没有用处
final
告诉从您的类派生的开发人员,您从未打算让他们重写函数。它让你说“请只调用这个函数。不要重写。”在我看来,它更多的是一个接口或通信机制,而不是其他任何东西。

final关键字不用于这种安全性。它不能替代通常需要加密解决方案的内容

在这类讨论中,“安全性”通常指的是安全对象模型的概念,也就是说,对象模型不能被使用者操纵以达到类的原始作者所不希望的目的

某种程度上,一个构造良好的类将封装其状态,而一个只有final方法的类将不允许使用者重写该类的行为并更改封装状态的方式。类可以公开其状态(例如通过公共字段),并且没有final关键字能够保护该状态的完整性

它更多的是“改变”东西,而不是“保护”。最后一个关键字简单地取消了更改/修改/扩展任何方法的功能

它并没有使代码更安全,它更像是为了线程安全。如果变量标记为final,则在创建对象时必须为其指定一个值。创建对象后,无法使该变量引用其他值

当多个线程同时访问对象时,此行为允许您对对象的状态进行推理并做出某些假设

我不认为做一个现场总结会增加对恶意攻击的安全性(更可能是针对错误,当然还有线程问题)。唯一的“真正形式”的安全性是,如果您有一个最终常量字段,它可能在编译时内联,因此在运行时更改其值不会产生任何影响


在继承的背景下,我听说了final和security。通过将类设为final,您可以防止有人对其进行子类化,并接触或重写其受保护的成员,但我还是想用它来避免错误,而不是防止威胁。

假设您向公众发布了一些奇特的SWC库。在这种情况下,可以防止重写方法

package
{
    import flash.display.Sprite;

    public class FinalDemo extends Sprite
    {
        public function FinalDemo()
        {
            super();
            var someClientInstance:ExtendedAPIClient = new ExtendedAPIClient();
            // doSomething is overridden by ExtendedAPIClient
            someClientInstance.doSomething();
            // activate cannot be overridden
            someClientInstance.activate("mySecretAPIKey");

            var myApp:MySupaDupaApplication = new MySupaDupaApplication(someClientInstance);

        }
    }
}

/**
 * Assume this class is within a swc that you release to the public.
 * You want every developer to get some APIKey
 * */
internal class MySupaDupaApplication{
    public function MySupaDupaApplication($apiClient:APIClient):void{
        if($apiClient.activated)trace("It's a valid user, do something very cool");
    }
}

/**
 * In order to activate a Client the developer needs to pass a 
 * instance of the API Client to the Application.
 * The application checks the activated getter in order to determine
 * if the api key is valid.
 * */
internal class APIClient{

    private var __activated:Boolean = false;

    public function APIClient(){        
        trace("APIClient Constructor");
    }

    /**
     * override possible
     * */
    public function doSomething():void{
        trace("doing something");
    }

    /**
     * override not possible
     * */
    public final function activate($key:String):void{
        trace("activate "+$key);
        if($key == "mySecretAPIKey"){
            __activated = true;
        }else{
            __activated = false;
            throw new Error("Illegal Key");
        }
    }

    /**
     * override not possible
     * */
    public final function get activated():Boolean{
        return __activated;
    }   
}

/**
 * Class within some developers library using MySupaDupaApplication
 * Changes the Client behaviour
 * Exploit of activation not possible
 * */
internal class ExtendedAPIClient extends APIClient{

    public function ExtendedAPIClient(){
        trace("ExtendedAPIClient Constructor");
        super();
    }

    override public function doSomething():void{
        trace("doing something else");
    }

    /* this will throw a compiler error */
    /*
    override public function activate($key:String):void{
        // do nothing
    }

    override public function get isActivated($key:String):Boolean{
        return true;
    }   
    */  
}

final
确实有助于减少错误。引起我注意的是“恶意利用”。你是说
final
不会影响恶意攻击吗?它不是“抵御攻击”意义上的“安全”。这更像是“更难搞错”。我更喜欢“安全”这个词;我觉得这更像是预防事故,而不是恶意;这种安全性由
final
提供。这本书声称这可以防止恶意攻击,这与无意中的错误不同。我想你可以称之为安全:)通过反编译字节码来解决这一问题似乎很简单。据我所知,这是提到的安全问题