java默认沙箱:
一,沙箱成员(要素)
1.权限
如:permission java.io.FilePermission "<<ALL FILES>>" , "read,write,delete,execute"
2.代码源
3.保护域
4.策略文件
5.密钥库
二,代码源
权限放在最后总结
1,包含:代码基、签名者
2,代码基可以是任何合法的url,签名者是密钥库中的某一个别名。
三、密钥库
保存证书和密码的数据库。代码如果被签名,需要用密钥库中的证书才能验证
四,策略文件
代码源的权限记录,
我们可以这么说:在这个文件里面,配置了java代码的各种权限。Java代码如果没有权限访问某一个文件,可能与这个配置文件有很大关系
%javahome%\jre\lib\security\java.policy文件默认代码:
// Standard extensions get all permissions by default
grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
// default permissions granted to all domains
grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See the API specification of java.lang.Thread.stop() for more
// information.
permission java.lang.RuntimePermission "stopThread";
// allows anyone to listen on dynamic ports
permission java.net.SocketPermission "localhost:0", "listen";
// "standard" properies that can be read by anyone
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};
java默认的策略文件路径为:javahome/jre/lib/security/java.policy
策略文件可以通过 policytool工具进行管理,不宜出错
策略文件可以自定义,可以有多个,前提是需要修改java.security文件,
如java.security文件修改如下:
#把policy.allowSystemProperty 设置为true,允许指定系统属性
policy.allowSystemProperty = true
#策略文件必须按顺序编号
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${java.home}/lib/security1/java.policy
五,权限
权限组成要素:类型,名,操作
1,文件权限
如:permission java.io.FilePermission "<<ALL FILES>>" , "read,write,delete,execute"
类型:permission java.io.FilePermission
名:文件的名称(全路径)、通配表示、<<ALL FILES>>等特殊表示
操作: read,write,delete,execute
2,套接字权限
类型:java.net.SocketPermission
名:地址:端口
操作:accept listen connect resolve
如:permission java.net.SocketPermission "*:1-","accept,listen"
3,属性权限
名:java虚拟机属性名
操作:读、写
permission java.util.PropertyPermission "java.*","read"
4,运行时权限
类型:java.lang.RuntimePermission
名:
accessClassInPackage.<name>
accessDeclaredMembers
createClassLoader
createSecurityManager
defineClassInPackage.<name>
exitVM
getClassLoader
getProtectionDomain 获得保护域
loadlibrary.<name> 装载制定的类库
modifyThread 调整线程参数
modifyThreadGroup
queuePrintJob
setIO
stioThread
setSecurityManager 设置安全管理器
..
操作:无,要么执行,要么不执行,所以不需要定义操作
如:permission java.lang.RuntimePermission "accessClassInPackage.sdo.foo"
有一些需要注意的地方
注意1、.<name>的使用,有点特殊。上句说明sdo.foo包中的类可以被访问。sdo被设置在security文件中,如下
package.access=sun,.sdo. ,一般这里设置的都是一些特殊的包,如sun包,不允许用户代码直接访问的。
注意2、不准在java标准包中定义任何类,即使有权限也无济于事
5,网络权限(除了套接字,java实现了url等网络类)
类型:java.net.NetPermission
名:specifyStreamHander ,在url类中安装新的流处理器
操作:无
6,AWT权限
免
7,安全权限
类型:java.security.SecurityPermission
名:addIdentityCertificate 为Identity对象增加一个证书
createAccessControlContext 创建存取控制环境
getDomainCombiner 撤销保护域
getProperty.<prop.name> 读取安全属性
getSignerPrivateKey
...
操作:无
8,序列化权限
类型:java.io.SerializablePermission
名:
enableSubstitution 允许创建对象流 ObjecIInputStream ObjectOutputStream
enableSubclassImplementation 允许创建对象流子类,覆盖readObject(),writeObject()方法
操作:无
9,反射权限
类型:java.lang.reflect.ReflectPermission
名:suppressAccessChecks ,检查私有变量
操作:无
10,完全权限
类型:java.security.AllPermission
名:无
操作:无