Java沙箱实现是重写类加载器和安全管理器,通过设置的全局安全管理器来控制执行程序的权限
说明: 安全策略只对安装安全管理器之后的类生效,之前的类不再此管理范围之内,利用这一点可以预先设置我们需要的操作,而对某个点之后的所有非法操作进行权限设置.
类加载器重写
/**
* [重写的类加载器]
* 沙箱程序类加载器,可根据指定路径加载制定类class文件.
*
* [说明]
* 仅包内可见
*
* @author 刘金鑫
* @version 1.0
* */
package org.hljoj.core.judge.sandbox;
import java.io.File;
import java.io.FileInputStream;
import org.hljoj.core.judge.util.ConstantParam;
class SandboxClassLoader extends ClassLoader{
/**默认classPath*/
private String _classPath;
/**
* 构造函数
* @param classPath 类加载器默认classPath
* */
public SandboxClassLoader(String classPath) {
this._classPath = classPath;
}
@Override
protected Class> findClass(String className) throws ClassNotFoundException {
return loadClass(_classPath, className);
}
/**
* 更改类加载器加载类的classpath,在制定路径下加载制定的类class文件
* @paramclassPath要加载的类路径
* @paramclassName 要加载的类名
* 最为限定,只能加载不含包的类.
* */
public Class> loadClass(String classPath, String className) throws ClassNotFoundException{
if(className.indexOf('.') >= 0) {
throw new ClassNotFoundException(className);
}
File classFile = new File(classPath + ConstantParam.SEPARATOR + className + ".class");
byte[] mainClass = new byte[(int) classFile.length()];
try {
FileInputStream in = new FileInputStream(classFile);
in.read(mainClass);
in.close();
} catch (Exception e) {
//e.printStackTrace();
throw new ClassNotFoundException(className);
}
return super.defineClass(className, mainClass, 0, mainClass.length);
}
/**
* 获取classPath
* @return StringclassPath
* */
public Stri