如果我们考虑这段代码,是否存在安全风险?如果是,那么为什么 java 允许这样做?
class SomeApi
{
void someImportantInnerApiMethod()
{
//some operation
}
}
class MaliciousUserClass extends SomeApi
{
@Override
public void someImportantInnerApiMethod()
{
super.someImportantInnerApiMethod();
//inner api method now exposed
}
}
最佳答案
访问修饰符并不意味着安全。无论如何,您甚至可以通过反射调用私有(private)方法。它们旨在进行封装,以防止编程错误并在一定程度上强化良好的编程风格。
即使您无法将重写的方法公开,您仍然可以这样做:
class SomeApi
{
void someImportantInnerApiMethod()
{
//some operation
}
}
class MaliciousUserClass extends SomeApi
{
public void aMethodWithATotallyDifferentName()
{
// ... that still exposes that important inner API method!
super.someImportantInnerApiMethod();
}
}
既然你可以通过这种方式使其“可访问”,那么Java所做的唯一一件事就是允许你在保留方法名称的同时做完全相同的事情,如果你真的想这样做的话。不会造成任何伤害,因为您通常不会意外地做这种事情。
还值得一提的是,包私有(private)访问非常容易被规避:与.Net的内部
不同,您确实可以将您的类与您正在使用的另一个库放在同一个包中,并且您可以自由调用包私有(private)方法!假设您将类声明为 javax.swing 包的一部分,现在它可以调用 Swing 的包私有(private)方法。安全就这么多了。您甚至不需要继承和/或反射。
关于java - 为什么我可以增加子类中重写方法的可见性,这不是安全风险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024043/