Sat*_*tya 24 java security reflection
如何限制开发人员使用反射来访问Java中的私有方法和构造函数?
使用普通的Java代码,我们无法访问类外的私有构造函数或私有方法.但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数.
那么我们如何为Java代码提供安全保障呢?
checkPermission()在所有私有方法/构造函数中添加方法.check sun.reflect.Reflection.getCallerClass(int n)由断言使用checkPermission callerClass=selfClass.
该getCallerClass返回的类中的方法的realFramesToSkip帧在堆栈中向上(从零开始),忽略与相关联的帧java.lang.reflect.Method.invoke()和它的实现.第一帧是与此方法关联的帧,因此getCallerClass(0)返回Class对象sun.reflect.Reflection.
public class PrivateConstructorClass {
private PrivateConstructorClass() {
checkPerMission();
//you own code go below
}
void checkPerMission() {
Class self = sun.reflect.Reflection.getCallerClass(1);
Class caller = sun.reflect.Reflection.getCallerClass(3);
if (self != caller) {
throw new java.lang.IllegalAccessError();
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以尝试测试反射,它会失败:
public class TestPrivateMain {
Object newInstance() throws Exception {
final Class<?> c = Class.forName("package.TestPrivate");
final Constructor<?> constructor = c.getDeclaredConstructor();
constructor.setAccessible(true);
return constructor.newInstance();
}
public static void main(String[] args) throws Exception {
Object t = new TestPrivateMain().newInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10738 次 |
| 最近记录: |