漏洞代码展示:
有安全漏洞的代码:field.setAccessible(true),field.setAccessible(true) 允许程序员绕过java访问说明符access control 检查来改变似有变量或者调用私有方法。这些情况是不允许的。
public static void test() {
try{
Object obj = FieldDomain.class.newInstance();
Class<FieldDomain> clazz = FieldDomain.class;
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
if(field.getType() == String.class){
field.set(obj,"Chow");
}
}catch(Exception e){
e.printStackTrace();
}
}
解决方案:
解决漏洞后代码展示:不要通过调用 java.lang.reflect.Field 的 setAccessible 方法来更改属性的访问修饰符。而是基于 org.springframework.util.ReflectionUtils 的 makeAccessible 方法来更改属性的访问修饰符。
public static void test2() {
try{
Object obj = FieldDomain.class.newInstance();
Class<FieldDomain> clazz = FieldDomain.class;
Field field = clazz.getDeclaredField("name");
ReflectionUtils.makeAccessible(field);
if(field.getType() == String.class){
field.set(obj,"Chow");
}
}catch(Exception e){
e.printStackTrace();
}
}