我有一个特殊的要求,我需要确保只允许一个类中的特定方法调用第二个类中的公共(非静态)方法。不能使用继承。
一种选择是使用 StackTrace,如下所示:
A类.java
package org.rnd.stack;
public class ClassA {
public void methodA() throws IllegalAccessException {
Exception fake = new Exception("FAKE-IGNORE");
StackTraceElement[] stack = fake.getStackTrace();
StackTraceElement st = stack[1];
if ("org.rnd.stack.ClassB".equals(st.getClassName())
&& "methodB".equals(st.getMethodName())) {
System.out.println("You are allowed to call");
} else {
throw new IllegalAccessException("You are not allowed to call");
}
}
}
B类.java
package org.rnd.stack;
public class ClassB {
public void methodB() throws IllegalAccessException {
new ClassA().methodA();
}
public void illegalMethod() throws IllegalAccessException {
new ClassA().methodA();
}
public static void main(String[] args) {
try {
new ClassB().methodB();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
现在上述解决方案工作正常,但由于代码审计中的质量控制,我需要提出另一个(或更确切地说)更好的解决方案。有更好的方法来实现这一目标吗?
正确的做法是重新审视您的要求。只能由某些其他代码路径调用的方法不兼容public
。一般的最佳实践是使用包私有来防止外部调用者,并接受包中的任何代码could调用该方法,但不会,因为您或您的团队正在审核它。
方法可见性最终并不是阻止执行的安全解决方案;有人拥有您的 .class 文件并能够在计算机上执行它们,他们几乎可以做任何他们想做的事情。您不应该花费太多时间尝试锁定方法调用。相反,请清楚地记录该方法的意图(例如“辅助函数methodB()
,请勿在其他地方使用。“)并相信与您一起开发的人知道他们在做什么。您甚至可以给该方法一个清晰的名称,例如dangerousMethodBForInternalUseOnly()
如果你真的想在这件事上打败别人。
您也可能对。。。有兴趣依赖注入 http://en.wikipedia.org/wiki/Dependency_injection,这是一种使用类型系统来保护(而不是阻止)人们执行危险代码的设计模式。以下是关于 Guice(一种流行的 DI 框架)的一些讨论,其中更详细地介绍了该概念:
- Google I/O 2009 - 使用 Guice 的大型模块化 Java https://www.youtube.com/watch?v=hBVJbzAagfs
- Java on Guice:依赖注入,Java 方式 https://www.youtube.com/watch?v=0iSB0L9avmg
综上所述,作为一项学术练习,这里有一个将方法调用限制为固定数量的代码路径的选项 - 依赖共享秘密。添加一个Object secret
字段到您的锁定方法,并导致该方法失败,如果通过secret
与硬编码值不匹配(private static final Object SECRET = new Object()
)。然后,您可以使用其他机制仅将秘密共享给您允许的代码路径(例如,在锁定类中使用静态初始化程序将其发布到您明确信任的类)。
显然,恶意开发人员仍然可以解决这个问题,而且这非常恶心,但它会提供某种锁定行为,假设您可以相信您的锁定类不会在您不知情的情况下更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)