jvm注解 @CallerSensitive的用处

博客介绍了CallerSensitive注解的作用,黑客曾利用双重反射构造调用链欺骗反射权限检查,造成安全漏洞。使用CallerSensitive注解后,getCallerClass不再用固定深度寻找调用者,而是跳过标注该注解的反射接口方法,有效解决了此问题。

这个注解是为了堵住漏洞用的。曾经有黑客通过构造双重反射来提升权限,原理是当时反射只检查固定深度的调用者的类,看它有没有特权,例如固定看两层的调用者(getCallerClass(2))。如果我的类本来没足够权限群访问某些信息,那我就可以通过双重反射去达到目的:反射相关的类是有很高权限的,而在 我->反射1->反射2 这样的调用链上,反射2检查权限时看到的是反射1的类,这就被欺骗了,导致安全漏洞。使用CallerSensitive后,getCallerClass不再用固定深度去寻找actual caller(“我”),而是把所有跟反射相关的接口方法都标注上CallerSensitive,搜索时凡看到该注解都直接跳过,这样就有效解决了前面举例的问题

Java注解@Report可用于为代码元素(方法或字段)添加元数据信息,其使用方法和作用如下: ### 定义注解 使用@interface语法来定义注解@Report,注解中的每个方法表示一个配置参数,返回类型即是参数类型,可以通过default标识参数默认值,最常用的参数应当命名为value。若要让@Report可用在方法或字段上,可把@Target注解参数变为数组`{ ElementType.METHOD, ElementType.FIELD }`。示例代码如下: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target({ ElementType.METHOD, ElementType.FIELD }) public @interface Report { int type() default 0; String value() default ""; } ``` ### 使用注解 在类的方法或字段上使用@Report注解,为其添加元数据。示例如下: ```java public class Person { @Report(type = 1, value = "Field report") private String name; @Report(type = 2, value = "Method report") public void sayHello() { System.out.println("Hello!"); } } ``` ### 获取注解信息 在运行时,可以通过反射机制获取注解信息。示例如下: ```java import java.lang.reflect.Field; import java.lang.reflect.Method; public class Main { public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException { // 获取Person类定义的@Report注解 // 获取字段上的注解 Field field = Person.class.getDeclaredField("name"); Report fieldReport = field.getAnnotation(Report.class); if (fieldReport != null) { int fieldType = fieldReport.type(); String fieldValue = fieldReport.value(); System.out.println("Field Report - Type: " + fieldType + ", Value: " + fieldValue); } // 获取方法上的注解 Method method = Person.class.getMethod("sayHello"); Report methodReport = method.getAnnotation(Report.class); if (methodReport != null) { int methodType = methodReport.type(); String methodValue = methodReport.value(); System.out.println("Method Report - Type: " + methodType + ", Value: " + methodValue); } } } ``` ### 注解作用 Java注解本身对代码逻辑没有任何影响,但根据@Retention的配置不同,注解的生命周期和可访问性会有所不同。若配置为RUNTIME类型,注解会被加载进JVM,并且在运行期可以被程序读取,可用于在运行时动态获取代码元素的额外信息,从而实现一些特定的功能,如代码检查、配置读取等 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值