怎么不能使用"最终"成为安全问题?

Tim*_*Tim 9 oop final actionscript-3

从O'Reilly的Essential ActionScript 3.0(2007)第113页开始:

作为最终帮助的方法隐藏了类的内部细节.使类或方法最终阻止其他程序员扩展类或重写方法以检查类的内部结构.这种预防被认为是保护应用程序免遭恶意攻击的方法之一.

这是指编译的,封闭源包的API的用户,以及"恶意利用"来学习关于类设计的东西吗?这真的是个问题吗?

对于更多上下文,这是使用两个原因中的第二个final.在2007版中,它位于第113页的" 继承下字幕"下的" 防止类扩展和方法被覆盖"一章中.

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

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

  • 作为最终帮助的方法隐藏了类的内部细节.使类或方法最终阻止其他程序员扩展类或重写方法以检查类的内部结构.这种预防被认为是保护应用程序免遭恶意攻击的方法之一.

Bri*_*sio 8

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

但是,在AS3中,覆盖方法的能力是选择退出.这就是final关键字的作用.它允许基类作者说"此方法可能不会被覆盖".

关于封装有一些老派的想法,这表明AS3这样做是一个安全问题.但这主要是在公共API的情况下,您希望隐藏您的内容但公开其功能.

但是,在更现代的时代,我们已经了解到,反汇编和反思将允许恶意开发人员做他/她想做的任何事情,所以今天这不是一个问题.final在我看来,依靠安全是一个拐点,任何建议都应该被驳回.需要更加谨慎地考虑安全性.API需要架构,以便实现允许开发人员执行当时需要执行的操作,但安全关键信息不应包含在公共API中.

这并不是说final没用. final告诉开发人员从你的类派生你从未打算他们覆盖这个函数.它可以让你说"请只是调用这个函数.不要覆盖." 它更像是一个接口或通信机制,而不是其他任何东西,IMO.