一、 原理
1.引入
Package
Lib package
Applet package
为安全起见,各个applet package不能互相访问。
Package就像一道墙将相关的applet隔离开来,我们为每个applet package指定一个ID,称为contextID,JCRE在任何一个时刻必然处于某个contextID之下;实际上每个object都有一个属性owner表明该object是谁创建出来的,是从属于哪个applet package的。
只要contextID == owner,表明访问活动局限于一个package内,不会有任何问题。
特权contextID:0x00
JCRE context,当运行时处于该context下时,可以访问任何object。
2.原则
基本原则:
(1)JCRE context
(2)contextID == owner
3.问题
当不同包之间的applet需要通讯时:
机制:context切换
时机:函数调用
具体:AA.BB(),当AA是下列2种object时:
(1)JCRE entry(JCRE和普通context之间通讯)
(2)Shareable interface(两个普通context之间通讯)
但AA本身存在问题,违背上述两条基本原则。
例外:Global Array(全绿灯)
4.原则修正
终极原则:
(1)JCRE context
(2)contextID == owner
(3)JCRE entry object,shareable interface object(AA)
(4)Global Array
注:第三条原则受限于函数调用:若第一、第二条原则都违背,若访问AA的方法是允许的,但是若直接访问AA的数据域,会报安全异常。
二、实施
编译、convert的时候是无法实施的,因为其实我们可以认为Java语言是一种解释性语言。对访问可否的check是在执行时实施的,具体而言就是执行某些bytecode或者某些native方法时实施的。
1. bytecode
“An object is accessed when one of the following Java programming language
bytecodes is executed using the object’s reference:
getfield, putfield, invokevirtual, invokeinterface, athrow,
<T>aload, <T>astore, arraylength, checkcast, instanceof
<T> refers to the various types of array bytecodes, such as baload, sastore, etc”
注:(1)putfield,astore 这两条bytecode会对一个object的某个域或是一个array的某个域赋值,注意赋值操作的右值不能是temp型的JCRE entry object。
(2)invokevirtual, invokeinterface 若函数调用时有引用型参数时,会做安全检查。
(3)checkcast 若函数的返回值是引用型数据,会做安全检查。
(4)对于array,其具有特殊性,注意dTR问题。
2. native method