Java 反射(Reflection)功能强大,但确实存在一定的安全风险,尤其在不可信代码、复杂系统或安全敏感场景下需要谨慎使用。
下面从安全性、主要风险、典型攻击场景、防护建议几个方面说明。
反射不是不安全,而是“绕过正常访问控制”的机制。
Java 反射允许你在运行时:
这些能力在正常设计下是危险的,但在框架(Spring、Hibernate、Jackson 等)中又是必须的。
Field f = obj.getClass().getDeclaredField("secret");
f.setAccessible(true);
f.get(obj);
Method m = clazz.getMethod("exec", String.class);
m.invoke(null, "rm -rf /");
或通过:
Runtime.execProcessBuilder常见漏洞来源:
攻击链示例:
反序列化 → 反射调用 → 危险方法 → RCE
Class.forName("com.evil.Hack");
constructor.setAccessible(true);
JDK 9+ 引入模块系统:
--add-opens 强制打开(运维误配风险)| 组件 | 问题 |
|---|---|
| Fastjson | 反序列化 + 反射 → RCE |
| Jackson | 默认类型多态 → 反射调用 |
| Java 原生反序列化 | ObjectInputStream + 反射 |
| Spring | SpEL + 反射组合利用 |
✅ 安全场景:
❌ 危险场景:
❌ 禁止:
Class.forName(request.getParameter("class"));
if (!ALLOWED.contains(className)) {
throw new SecurityException();
}
java.lang.RuntimeProcessBuilderClass.forName 动态加载System.setSecurityManager(new SecurityManager());
⚠️ JDK 17 已废弃,但企业环境仍可用
--add-opens java.base/java.lang=ALL-UNNAMED
只开必要模块
enableDefaultTypingJava 反射是“双刃剑”:
框架离不开它,黑客也最爱它。
✅ 安全关键原则:
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。