确保Nashorn中JS执行的最佳方法是启用SecurityManager并让Nashorn拒绝关键操作。另外,您可以创建一个监视类,以检查脚本执行时间和内存,以避免无限循环和outOfMemory。如果您在受限的环境中运行它而无法设置SecurityManager,则可以考虑使用Nashorn ClassFilter拒绝对Java类的全部/部分访问。 除此之外,您还必须覆盖所有关键的JS函数(例如quit()等)。看一下管理所有这些方面的功能(内存管理除外):
public static Object javascriptSafeEval(HashMap parameters, String algorithm, boolean enableSecurityManager, boolean disableCriticalJSFunctions, boolean disableLoadJSFunctions, boolean defaultDenyJavaClasses, List javaClassesExceptionList, int maxAllowedExecTimeInSeconds) throws Exception {
System.setProperty("java.net.useSystemProxies", "true");
Policy originalPolicy = null;
if(enableSecurityManager) {
ProtectionDomain currentProtectionDomain = this.getClass().getProtectionDomain();
originalPolicy = Policy.getPolicy();
final Policy orinalPolicyFinal = originalPolicy;
Policy.setPolicy(new Policy() {
@Override
public boolean implies(ProtectionDomain domain, Permission permission) {
if(domain.equals(currentProtectionDomain))
return true;
return orinalPolicyFinal.implies(domain, permission);
}
});
}
try {