Revert "fix(security): SecurityClassFilter 改为白名单策略"

This reverts commit a83665ac44.
This commit is contained in:
yukaidi
2026-05-29 00:35:10 +08:00
parent 6dfa770137
commit 32d467b6d9

View File

@@ -78,76 +78,41 @@ public class SecurityClassFilter implements ClassFilter {
"jdk.nashorn.internal", "jdk.nashorn.internal",
"jdk.internal", "jdk.internal",
}; };
// 白名单:明确允许 JS 解析器使用的类
private static final String[] ALLOWED_CLASSES = {
// Nashorn 脚本对象
"org.openjdk.nashorn.api.scripting",
"jdk.nashorn.api.scripting",
// 基础集合类
"java.util",
// 基础类型
"java.lang.String",
"java.lang.Integer",
"java.lang.Long",
"java.lang.Double",
"java.lang.Boolean",
"java.lang.Math",
"java.lang.Number",
"java.lang.Object",
"java.lang.StringBuilder",
"java.lang.StringBuffer",
"java.lang.Character",
"java.lang.Byte",
"java.lang.Short",
"java.lang.Float",
"java.lang.Enum",
"java.lang.Iterable",
"java.lang.Comparable",
// 时间类
"java.time",
// 文本处理
"java.text",
};
// 白名单包前缀
private static final String[] ALLOWED_PACKAGES = {
"java.util.",
"java.time.",
"java.text.",
"org.openjdk.nashorn.api.scripting.",
"jdk.nashorn.api.scripting.",
};
@Override @Override
public boolean exposeToScripts(String className) { public boolean exposeToScripts(String className) {
// 1. 先检查黑名单(快速拒绝已知危险类) // 检查是否在黑名单中
for (String dangerous : DANGEROUS_CLASSES) { for (String dangerous : DANGEROUS_CLASSES) {
if (className.equals(dangerous) || className.startsWith(dangerous + ".")) { if (className.equals(dangerous) || className.startsWith(dangerous + ".")) {
log.warn("🔒 安全拦截: JavaScript尝试访问危险类 - {}", className); log.warn("🔒 安全拦截: JavaScript尝试访问危险类 - {}", className);
return false; return false;
} }
} }
// 2. 检查白名单(只允许明确安全的类) // 额外的包级别限制
for (String allowed : ALLOWED_CLASSES) { String[] dangerousPackages = {
if (className.equals(allowed) || className.startsWith(allowed + ".")) { "java.lang.reflect.",
log.debug("✅ 白名单允许: {}", className); "java.io.",
return true; "java.nio.",
} "java.net.",
} "java.sql.",
"javax.script.",
// 3. 检查白名单包前缀 "sun.",
for (String pkg : ALLOWED_PACKAGES) { "jdk.internal.",
"jdk.nashorn.internal."
};
for (String pkg : dangerousPackages) {
if (className.startsWith(pkg)) { if (className.startsWith(pkg)) {
log.debug("✅ 白名单包允许: {}", className); log.warn("🔒 安全拦截: JavaScript尝试访问危险包 - {}", className);
return true; return false;
} }
} }
// 4. 默认拒绝(白名单策略) // 默认拒绝(白名单策略更安全,但这里为了兼容性使用黑名单
log.warn("🔒 安全拦截: JavaScript尝试访问未授权类 - {}", className); // 如果要更严格,可以改为 return false
return false; log.debug("允许访问类: {}", className);
return true;
} }
} }